在 while 循环中限制创建的任务的正确方法

Proper way to throttle created tasks within a while loop

我有一个等待消息到达队列的侦听器。我想限制任务的数量,以便对于队列中的每 1000 条消息,我需要等到它们完成后再处理下一组消息。原因是 ProcessMessage 代码调用了一个 WCF 服务,而且它似乎同时被太多的并发调用超载了。

我想知道这是实现这种节流的最佳方式吗?下面这段代码看起来有点老套。

var isEmpty = false;
var maxThreads = 1000;
var currentThreadCount = 0;
List<Task> taskList = new List<Task>();
while(!isEmpty)
{
  var message = GetMessageFromServer();
  if(!String.IsNullorEmpty(message))
  {
     isEmpty = true;
  }
  else
  {
    if(currentThreadCount == maxThreads)
     {
       task.WaitAll(tasksList.ToArray());
       currentThreadCount = 0;
     }
    else
    {
    taskList.Add(Task.Run(() => ProcessMessage(message)));
    }
  }    
}

假设您对 ProcessMessage 的结果感兴趣,我建议您考虑使用 Channels (cf.)。

对于您的解决方案而言,这可以改进的是您可以确保工作量一致,并且不会在达到 1000 时停止并等待所有任务完成。