【问题标题】:Run multiple asynchronous Tasks continuously连续运行多个异步任务
【发布时间】:2020-06-08 02:20:03
【问题描述】:

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

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

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

有什么简单的方法吗?

【问题讨论】:

标签: c# async-await


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2011-04-15
    • 1970-01-01
    • 2018-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-10
    • 1970-01-01
    • 2021-08-01
    相关资源
    最近更新 更多