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

Pum*_*per 8 c# throttling task-parallel-library async-await

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

public async Task DoWork()
{

}
Run Code Online (Sandbox Code Playgroud)

我现在有一个:

List<Task> tmp = new List<Task>();
Run Code Online (Sandbox Code Playgroud)

在哪里我添加任务.

我开始这样的任务:

foreach (Task t in tmp)
{
    await t;
}
Run Code Online (Sandbox Code Playgroud)

现在我的问题:

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

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

在队列启动后还应该可以添加更多任务.

我使用的是.NET 4.5.

谢谢你的任何建议

Ste*_*ary 19

实际上,一旦你打电话,任务就会开始DoWork ; 当你await他们,你正在完成任务.

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

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

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