我有一个需要迭代并行处理的对象的列表。这是我需要做的:
foreach (var r in results)
{
r.SomeList = await apiHelper.Get(r.Id);
}
由于我想对其进行parellelize,因此我尝试使用Parallel.ForEach(),但它没有等到所有事情都完成之后才开始使用
apiHelper.Get()正在自己内部进行等待。
Parallel.ForEach(
results,
async (r) =>
{
r.SomeList = await apiHelper.Get(r.Id);
});
所以我在网上搜索后发现:
Nesting await in Parallel.ForEach
现在我对TPL非常陌生(20分钟大),我可能会遗漏一些明显的东西。我该如何进行?
var getBlock = new TransformBlock<string, List<Something>>(
async i =>
{
var c = await apiHelper.Get(i);
return c;
}, new ExecutionDataflowBlockOptions
{
MaxDegreeOfParallelism = DataflowBlockOptions.Unbounded
});
foreach (var r in results)
{
r.SomeList = getBlock.Post(r.Id); // ERROR: Can't convert boolean to list.
}
getBlock.Complete();
参考方案
这是在ActionBlock Class库中使用TPL dataflow的示例。
它基本上为您提供了并行,并且async
及其相当容易理解
数据流示例
public static async Task DoWorkLoads(List<Something> results)
{
var options = new ExecutionDataflowBlockOptions
{
MaxDegreeOfParallelism = 50
};
var block = new ActionBlock<Something>(MyMethodAsync, options);
foreach (var result in results)
block.Post(result );
block.Complete();
await block.Completion;
}
...
public async Task MyMethodAsync(Something result)
{
result.SomeList = await apiHelper.Get(result.Id);
}
显然,您需要进行错误检查,并添加胡椒粉和盐调味
另外,假设apiHelper
是线程安全的
使用map和map_async有什么区别?将列表中的项目分配给4个进程后,它们是否运行相同的功能?因此,假设两者都在异步和并行运行是错误的吗?def f(x): return 2*x p=Pool(4) l=[1,2,3,4] out1=p.map(f,l) #vs out2=p.map_async(f,l) python大神给出的解决方案 将作业映射到流程…
等待异步方法中已完成的任务 - c#当我们调用异步方法时,我们返回一个包装器任务。public async Task ExecuteActionAsync() { // no await called } public async Task ExecuteActionAwaitAsync() { // await called on a completed await Task.Complet…
简便的方法来等待已取消的任务? - c#我发现自己经常这样编写代码:try { cancellationTokenSource.Cancel(); await task.ConfigureAwait(false); // this is the task that was cancelled } catch(OperationCanceledException) { // Cancellation…
了解C#等待运算符 - c#我只是对C#的异步编程有一些基本的了解。据我了解,这段代码statement1; await statement2(); statement3; statement4; 在逻辑上应等效于statement1; var awaiter = statement2().GetAwaiter(); awaiter.OnCompletion(() => { aw…
等待Task.CompletedTask是否意味着async方法将同步运行? - c#static async Task WaitTaskCompleted() { //Use Thread A before await Task.CompletedTask await Task.CompletedTask; //Will the code after await Task.CompletedTask always use Thread A,…