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

标签 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。

谢谢你的建议

最佳答案

实际上,一旦您调用 DoWork,任务就会开始 ;当你await他们,您正在完成任务。

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

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

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

关于队列或等待列表中的 C# 异步任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20904328/

相关文章:

c# - 如何模拟在被测方法中实例化的对象

c# - 返回有意义的返回值的方法

c# - 在并行处理中伪造长时间运行的进程的最佳方法是什么?

rust - 如何在循环中生成异步方法?

c# - 为什么即使我尝试从工作人员更改 UI 时同步上下文仍为空,为什么即使我不这样做,工作人员仍在 UI 线程上等待?

javascript - 在 forEach 中等待 catch block 失败

c# - File.ReadLines(file).Skip(numLines) 是如何工作的?

c# - WCF 中 OperationTimeout 和 SendTimeout 的区别

.net - 其他任务完成时通知任务

php - 使用 xyz.tpl.php/CSS 文件的所见即所得方式?