我想在我正在開發的應用程序中使用.NET Backgroundworker對象。.NET Backgroundworker對象的線程優先級
所有互聯網上的材料說,這個物體在「後臺」運行,但無處我已能夠證實,這個後臺線程確實是一個「低優先級」模式運行。這個問題的產生是因爲在Windows中(我認爲)後臺任務可以以「正常」或「低於正常」或「低」優先級模式運行。
在我的應用程序,我想我自己設定的優先級DoWork的函數內通過調用 ...
Thread.CurrentThread.Priority=ThreadPriority.Lowest
...
但這似乎沒有任何效果。背景工作者是否會忽略此調用?
我想解釋些:
我的應用程序是一個互聯網客戶端收集溫度的實時數據,從室內溼度等,並上傳到一個網頁(不是Web服務)使用
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的雙核筆記本電腦。
問題是,當後臺線程調用UploadAsync,它似乎是阻止/減慢UI線程。我可以這樣說,因爲上傳發生時調試語句會暫停。我怎樣才能避免這種情況? – 2009-02-08 05:24:56
你有多少核心?這項工作必須發生在某個地方...... – 2009-02-08 09:18:15
這是一款雙核筆記本電腦,採用Win XP。 – 2009-02-08 18:25:27