繁体   English   中英

连续运行多个异步任务

[英]Run multiple asynchronous Tasks continuously

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

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

我想要的是,无论何时完成一项任务,都会开始新的任务。 超时也很好,以防止任务在失败的情况下无限期运行。

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

我想要的是,无论何时完成一项任务,都会开始新的任务。

这是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(); }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM