【问题标题】:C# async tasks in a queue or waiting list队列或等待列表中的 C# 异步任务
【发布时间】:2014-01-21 03:54:41
【问题描述】:

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

public async Task DoWork()
{

}

我现在有一个:

List<Task> tmp = new List<Task>();

我在哪里添加任务。

我这样开始任务:

foreach (Task t in tmp)
{
    await t;
}

现在我的问题:

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

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

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

我正在使用 .NET 4.5。

感谢您的建议

【问题讨论】:

标签: c# task-parallel-library async-await throttling


【解决方案1】:

其实任务开始只要你调用DoWork;当您await他们时,您正在完成任务。

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

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

另一种选择是使用实际队列,例如 ActionBlock&lt;T&gt;,它具有内置的限制支持。

【讨论】:

  • 哇,谢谢。它就像一个魅力!我现在使用:SemaphoreSlim
  • 您也可以考虑使用响应式扩展进行节流。
猜你喜欢
  • 1970-01-01
  • 2019-11-17
  • 1970-01-01
  • 1970-01-01
  • 2014-03-19
  • 2013-04-12
  • 2019-03-04
  • 1970-01-01
  • 2014-09-15
相关资源
最近更新 更多