我正在开发一个应用程序,尝试使用.NET Backgroundworker对象。网络上的所有资料都说这个对象在“后台”运行,但是我无法确认这个后台线程是否确实以“低优先级”模式运行。这个问题的原因是在Windows中(我假设),后台任务可以在“正常”或“低于正常”或“低”优先级模式下运行。
在我的应用程序中,我尝试在DoWork函数内部通过调用...来自己设置优先级。
当我运行程序时,我发现每次调用UploadValuesAsync时,调试窗口的打印都会停止。我还添加了调试语句以查看队列中有多少读数。如果这个任务确实是以低优先级运行的,我希望看到队列计数随着数据的获取而迅速增加,只有在前台空闲且不获取数据时才会减少。但事实并非如此。一旦将读数添加到队列中,它就会被出队并上传。因此,队列计数始终为1或0!
我的方法有问题吗?我是否根本不应该使用后台工作器对象?
顺便说一下,这是在运行Windows XP的双核笔记本电脑上进行的。
在我的应用程序中,我尝试在DoWork函数内部通过调用...来自己设置优先级。
Thread.CurrentThread.Priority=ThreadPriority.Lowest
但是这似乎没有任何效果。BackgroundWorker是否忽略了此调用?
我想再解释一下:
我的应用程序是一个互联网客户端,它从一个仓库收集温度、湿度等实时数据,并使用system.net.webclient.UploadValuesAsync(...)
调用将其上传到网页(不是Web服务)。
我已经编写了应用程序,使得客户端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的双核笔记本电脑上进行的。