【发布时间】:2009-02-07 20:10:54
【问题描述】:
我正在尝试在我正在开发的应用程序中使用 .NET Backgroundworker 对象。
互联网上的所有资料都说这个对象在“后台”运行,但我无法确认这个后台线程确实在“低优先级”模式下运行。出现这个问题是因为在 Windows(我假设)中,后台任务可以在“正常”或“低于正常”或“低”优先级模式下运行。
在我的应用程序中,我尝试通过调用自己在 DoWork 函数中设置优先级 ...
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 的双核笔记本电脑。
【问题讨论】:
标签: .net multithreading backgroundworker