.NET Backgroundworker 對象的執行緒優先級
我正在嘗試在我正在開發的應用程序中使用 .NET Backgroundworker 對象。
網際網路上的所有資料都說該對像在“後台”執行,但我無法確認該後台執行緒確實以“低優先級”模式執行。出現這個問題是因為在 Windows(我假設)中,後台任務可以在“正常”或“低於正常”或“低”優先級模式下執行。
在我的應用程序中,我嘗試通過呼叫 …
Thread.CurrentThread.Priority=ThreadPriority.Lowest…
但這似乎沒有效果。後台工作人員是否忽略此呼叫?
我想再解釋一些:
我的應用程序是一個網際網路客戶端,它從室內收集有關溫度、濕度等的實時數據,並使用
system.net.webclient.UploadValuesAsync(...)來電我已經編寫了應用程序,以便客戶端 GUI 從腔室收集數據,為它們加上時間戳,然後將它們排隊等待上傳,就像這樣
…
Synclock objlock debug.print("Queueing reading...") dataQ.Enque(reading) End Synclock ...backgroundworker 的 Dowork 函式出列,然後像這樣上傳……
…………..
Do if dataQ.count() <> 0 then Synclock objlock reading = dataQ.DeQue() End Synclock Dim client As New System.Net.WebClient ...put the reading in NameValueCollection and upload to server page req = new NameValueCollection ... ... client.UploadValuesAsync(uri, "POST", req) endif thread.sleep(1) 'without this line the CPU usage goes upto 100% and seems to slow other tasks! Loop…………….
當我執行程序時,我發現每當呼叫 UploadValuesAsync 時,調試視窗就會停止。我還添加了調試語句以隨時查看隊列中有多少讀數。如果此任務真正以低優先級執行,我希望看到隊列計數在獲取數據時迅速增加,然後僅在前台空閒且未獲取數據時減少。但這種情況並非如此。一旦將讀數添加到隊列中,它就會出列並上傳。因此隊列計數始終為 1 或 0!
我的方法有問題嗎?我根本不應該使用後台工作者對象嗎?
順便說一句,這是在執行 Windows XP 的雙核筆記型電腦中。
只是補充一下 Jon 和 Marc 已經說過的話:
後台執行緒沒有較低的優先級。前台執行緒和後台執行緒之間的區別在於,一旦沒有更多前台執行緒在執行,CLR 將關閉程序。執行緒池執行緒是後台執行緒。
您實際上可以設置執行緒池執行緒的優先級,但是由於您幾乎無法控制哪個執行緒池執行緒將實際執行您的任務,因此不建議這樣做。如果您需要特定優先級的執行緒,您應該使用 Thread 類型創建它們並根據需要設置實例的優先級。