队列或等待列表中的C#异步任务

时间:2014-01-03 13:03:30

标签: c# task-parallel-library async-await throttling

我有一个像这样的异步任务:

public async Task DoWork()
{

}

我现在有一个:

List<Task> tmp = new List<Task>();

我添加任务。

我开始这样的任务:

foreach (Task t in tmp)
{
    await t;
}

现在我的问题:

启动任务的最佳方式是什么,同时只运行其中3个(直到其他人等待)?

我想我需要像队列/等待名单一样的东西?

也可以在队列启动后添加更多任务。

我使用的是.NET 4.5。

感谢您提出任何建议

1 个答案:

答案 0 :(得分:18)

实际上,只要您拨打DoWork,任务就会启动;当你await时,你完成任务。

限制任务的一个选项是SemaphoreSlim,您可以这样使用:

private SemaphoreSlim _mutex = new SemaphoreSlim(3);
public async Task DoWorkAsync()
{
  await _mutex.WaitAsync();
  try
  {
    ...
  }
  finally
  {
    _mutex.Release();
  }
}

另一种选择是使用实际队列,例如ActionBlock<T>,它具有内置的限制支持。