连续运行多个异步任务

时间:2020-02-24 12:39:42

标签: c# async-await

我想实现一个无限期运行的预定数量(比如10个)异步任务的池。

使用 Task.WhenAll ,我可以轻松地启动10个任务,将它们输入一个列表,然后在此列表中调用 await Task.WhenAll(list)。一旦方法回来,我就可以在接下来的10个元素上重新开始整个过程​​。这种解决方案面临的问题是,它在循环之前要等待最长的任务完成,这不是最佳选择。

我想要的是,只要任务完成,就开始一个新任务。超时也很重要,这样可以防止发生故障时无限期地运行任务。

有没有简单的方法可以做到这一点?

1 个答案:

答案 0 :(得分:3)

我想要的是,只要任务完成,就会开始一个新任务。

这是SemaphoreSlim的完美用例:

private readonly SemaphoreSlim _mutex = new SemaphoreSlim(10);

public async Task AddTask(Func<Task> work)
{
  await _mutex.WaitAsync();
  try { await work(); }
  finally { _mutex.Release(); }
}

为了防止在失败的情况下无限期地运行任务,超时也是很好的选择。

超时的标准模式是使用CancellationTokenSource作为计时器,并将CancellationToken传递到需要支持取消的工作中:

private readonly SemaphoreSlim _mutex = new SemaphoreSlim(10);

public async Task AddTask(Func<CancellationToken, Task> work)
{
  await _mutex.WaitAsync();
  using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(10));
  try { await work(cts.Token); }
  finally { _mutex.Release(); }
}
相关问题