亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

.NET Real-Time 和 TaskMgr 實時優先級有什么區別?

.NET Real-Time 和 TaskMgr 實時優先級有什么區別?

C#
繁星coding 2022-07-10 10:07:28
當我在 .NET 中將進程的優先級類設置為實時時:Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.RealTime;它僅在任務管理器中顯示為“高”優先級:如果我在任務管理器中手動將其設置為實時,然后Process.GetCurrentProcess()再次執行,ProcessPriorityClass仍然報告為ProcessPriorityClass.RealTime.如果我以管理員身份運行應用程序,則優先級會更改為實時,正如任務管理器所報告的那樣。所以看起來,當以普通用戶身份運行時,你可以將其設置為 RealTime,它會被 .NET 報告為這樣,但該進程的實際優先級實際上只是 High。為什么在這種情況下 .NET 和 TaskManager 會報告不同的值?
查看完整描述

1 回答

?
慕森卡

TA貢獻1806條經驗 獲得超8個贊

這里真正的罪魁禍首是Windows。


屬性的設置器PriorityClass很簡單:


 set {

        if (!Enum.IsDefined(typeof(ProcessPriorityClass), value)) { 

            throw new InvalidEnumArgumentException("value", (int)value, typeof(ProcessPriorityClass));

        }


        // BelowNormal and AboveNormal are only available on Win2k and greater.

        if (((value & (ProcessPriorityClass.BelowNormal | ProcessPriorityClass.AboveNormal)) != 0)   && 

            (OperatingSystem.Platform != PlatformID.Win32NT || OperatingSystem.Version.Major < 5)) {

            throw new PlatformNotSupportedException(SR.GetString(SR.PriorityClassNotSupported), null);

        }                


        SafeProcessHandle handle = null;


        try {

            handle = GetProcessHandle(NativeMethods.PROCESS_SET_INFORMATION);

            if (!NativeMethods.SetPriorityClass(handle, (int)value)) {

                throw new Win32Exception();

            }

            priorityClass = value;

            havePriorityClass = true;

        }

        finally {

            ReleaseProcessHandle(handle);

        }

    }

經過幾次健全性檢查后,它調用 Windows API SetPriorityClass,然后檢查返回碼。如果發生錯誤,它會拋出異常。否則,它會在本地存儲新優先級的值(這樣,當您讀取 的值時PriorityClass,它不必調用 Windows 來檢查它)。


在某些情況下,Windows 會拒絕更改優先級(例如,正如您所注意到的,您現在需要管理員權限來設置實時優先級)。訣竅是 Windows默默地拒絕優先級更改并且不返回錯誤代碼。如此處所述:


請注意,即使優先級未設置為 REALTIME_PRIORITY_CLASS,對 SetPriorityClass() 的調用也可能返回成功,因為如果您沒有“增加調度優先級”權限,則對 REALTIME_PRIORITY_CLASS 的請求將被解釋為對允許的最高優先級類的請求當前帳戶。


我猜這樣做是為了避免破壞不希望調用失敗的遺留應用程序。因此,您的 .NET 應用程序不知道優先級更改未按預期工作,并返回錯誤的值。


也就是說,即使 Windows 確實按預期設置了優先級,.NET 代碼在某些情況下仍然無法工作。例如,假設您正在設置PriorityClassto BelowNormal。Process如上所述,該值將本地存儲在對象中。然后,如果您再次更改優先級,但從任務管理器中,就像以前一樣。NET 不會意識到它并返回舊值。


如果您絕對需要最新信息,請先調用process.Refresh()以清除本地存儲的值。


查看完整回答
反對 回復 2022-07-10
  • 1 回答
  • 0 關注
  • 107 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號