错误任务[]任务转换IEnumerable〈任务〉
//await Task.WhenAll(WithMaxConcurrency(tasks,3)); // getting error at tasks conversion
var tasks = new Func<Task>[]
{
() => jack(),
() => roy(),
() => sam()
};
await Task.WhenAll(WithMaxConcurrency(tasks,3)); // getting error at tasks conversion
private static IEnumerable<Task<T>> WithMaxConcurrency<T>(IEnumerable<Task<T>> tasks, int maxParallelism)
{
SemaphoreSlim maxOperations = new SemaphoreSlim(maxParallelism);
// The original tasks get wrapped in a new task that must first await a semaphore before the original task is called.
return tasks.Select(task => maxOperations.WaitAsync().ContinueWith(_ =>
{
try { return task; }
finally { maxOperations.Release(); }
}).Unwrap());
}
要将Task[]任务放入IEnumerable〈Task〉
1条答案
按热度按时间gk7wooem1#
问题似乎是如何限制任务的执行。目前还不清楚这些任务是做什么的。.NET具有高级功能,允许在管道等中并发处理大量数据。一种选择是使用
Parallel.ForEachAsync
使用特定数量的worker来处理数据流使用Parallel.ForEachAsync
This example展示了如何检索Github用户bios,一次3个:
这也可以用来处理一个
Func<Task>
调用的集合,充当一个作业队列。但这不如处理一个输入流有用:Parallel.ForEachAsync
不返回任何结果。委托必须将它们存储在例如ConcurrentQueue中:使用数据流块
另一种选择是使用Dataflow块,例如ActionBlock来处理具有固定DOP的数据/调用:
块可以返回结果,并组合到处理步骤的管道中:
在本例中,
downloader
块一次检索3个文件,并将FileInfo
对象发送到Importer
块。该块一次将一个文件导入数据库。所有块并发工作,同时下载和导入数据。当所有文件都是请求时,
downloader.Complete()
告诉头块我们完成了。数据流块也可以用作异步工作队列,但这并不像正确使用它们那样灵活: