Sou*_*jan 7 .net multithreading backgroundworker
我正在尝试在我正在开发的应用程序中使用.NET Backgroundworker对象.
互联网上的所有资料都说这个对象在"背景"中运行,但我无法确认这个后台线程确实以"低优先级"模式运行.出现这个问题是因为在Windows中(我假设)后台任务可以在"正常"或"低于正常"或"低"优先级模式下运行.
在我的应用程序中,我尝试通过调用...在DoWork函数内设置优先级...
Thread.CurrentThread.Priority=ThreadPriority.Lowest
Run Code Online (Sandbox Code Playgroud)
...
但这似乎没有效果.后台工作者是否忽略此调用?
我想解释一下:
我的应用程序是一个互联网客户端,从一个房间收集有关温度,湿度等的实时数据,并使用上传到网页(不是网络服务)
system.net.webclient.UploadValuesAsync(...)
电话
我编写了应用程序,以便客户端GUI收集来自分庭的数据,给它们加上时间戳,然后将它们排队等待上传,就像这样
...
Synclock objlock
debug.print("Queueing reading...")
dataQ.Enque(reading)
End Synclock
...
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
................
当我运行程序时,我发现每当调用UploadValuesAsync时,打印输出调试窗口就会停止.我还添加了调试语句,以便随时查看队列中有多少读数.这项任务真正以低优先级运行,我希望看到队列数量在获取数据时迅速增加,然后仅在前台空闲且数据未被获取时减少.但这种情况并非如此.只要将读数添加到队列中,它就会出列并上传.所以队列数总是1或0!
我的方法有问题吗?我根本不应该使用background-worker对象吗?
顺便说一下,这是一台运行Windows XP的双核笔记本电脑.
Bri*_*sen 14
只是为了补充Jon和Marc已经说过的话:
后台线程的优先级不高.前台线程和后台线程之间的区别在于,一旦不再运行前台线程,CLR将关闭进程.线程池线程是后台线程.
您实际上可以设置线程池线程的优先级,但是由于您无法控制哪个线程池线程将实际运行您的任务,因此不建议这样做.如果需要特定优先级的线程,则应使用Thread类型创建它们,并根据需要在实例上设置优先级.
归档时间: |
|
查看次数: |
21493 次 |
最近记录: |