0

我有这个简单的任务

void DoWork(string job)

那应该在Azure Worker Role上并行执行很多次。我有这些选择:

  • 对 DoWork 的多次异步调用

    while(true) {DoWorkDelegate.BeginInvoke(...);}
    
  • 自己分配多线程

    while(true) {Thread t = new Thread( DoWork);
                 t.Start();}
    
  • 线程池

在利用率方面,推荐的方法是什么?

4

1 回答 1

2

这个例子可能过于简化了。在示例中,循环中的每次迭代都会启动一个新线程。虽然我完全同意@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) 循环。

于 2013-08-21T13:19:00.447 回答