我有这个简单的任务
void DoWork(string job)
那应该在Azure Worker Role上并行执行很多次。我有这些选择:
对 DoWork 的多次异步调用
while(true) {DoWorkDelegate.BeginInvoke(...);}
自己分配多线程
while(true) {Thread t = new Thread( DoWork); t.Start();}
线程池
在利用率方面,推荐的方法是什么?
我有这个简单的任务
void DoWork(string job)
那应该在Azure Worker Role上并行执行很多次。我有这些选择:
对 DoWork 的多次异步调用
while(true) {DoWorkDelegate.BeginInvoke(...);}
自己分配多线程
while(true) {Thread t = new Thread( DoWork);
t.Start();}
线程池
在利用率方面,推荐的方法是什么?
这个例子可能过于简化了。在示例中,循环中的每次迭代都会启动一个新线程。虽然我完全同意@DanielMann 使用 TPL 而不是线程,但添加
while (true) {
Task.Factory.StartNew(() => DoWork());
}
仍然会启动很多线程。确保在旋转线程之外进行工作测试,例如
while (true) {
job = FetchJobFromQueue();
if( job != null ){
Task.Factory.StartNew(() => DoWork(job));
}
else {
Thread.Sleep(1000);
}
}
请注意睡眠时间,以免将处理器固定在空循环上。
在一些相关的说明中,请查看这篇 MSDN文章,以正确处理退出条件的 while(true) 循环。