Dot-Net

.NET Backgroundworker 對象的執行緒優先級

  • February 9, 2009

我正在嘗試在我正在開發的應用程序中使用 .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 類型創建它們並根據需要設置實例的優先級。

引用自:https://stackoverflow.com/questions/524483