在 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 时停止并等待所有任务完成。
我有一个等待消息到达队列的侦听器。我想限制任务的数量,以便对于队列中的每 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 时停止并等待所有任务完成。