我想在我正在开发的应用程序中使用.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