我想做这样的事情:
public async Task MyMethod()
{
// Do some preparation
await Parallel.ForEachAsync(0, count, i => { // Do some work //});
// do some finalization
}
然而,我没有找到一种优雅的方式。我想到了两种方法,但它们是次优的:
Task.Factory.StartNew(() => Parallel.For(...));
。答案 0 :(得分:3)
你有一个常规的同步并行循环,你想异步调用它(大概是将它从UI线程移开)。
您可以像移动UI线程中的任何其他CPU绑定工作一样执行此操作:使用Task.Run
:
public async Task MyMethod()
{
// Do some preparation
await Task.Run(() => Parallel.ForEach(0, count, i => { /* Do some work */ }));
// do some finalization
}
没有线程“浪费”,因为Parallel.ForEach
将使用调用线程作为其工作线程之一。
(这是[{3}}中的配方7.4“并行代码的异步包装”)。