我有一个像这样的异步任务:
public async Task DoWork()
{
}
我现在有一个:
List<Task> tmp = new List<Task>();
我添加任务。
我开始这样的任务:
foreach (Task t in tmp)
{
await t;
}
现在我的问题:
启动任务的最佳方式是什么,同时只运行其中3个(直到其他人等待)?
我想我需要像队列/等待名单一样的东西?
也可以在队列启动后添加更多任务。
我使用的是.NET 4.5。
感谢您提出任何建议
答案 0 :(得分:18)
实际上,只要您拨打DoWork
,任务就会启动;当你await
时,你完成任务。
限制任务的一个选项是SemaphoreSlim
,您可以这样使用:
private SemaphoreSlim _mutex = new SemaphoreSlim(3);
public async Task DoWorkAsync()
{
await _mutex.WaitAsync();
try
{
...
}
finally
{
_mutex.Release();
}
}
另一种选择是使用实际队列,例如ActionBlock<T>
,它具有内置的限制支持。