【发布时间】:2016-11-11 22:28:33
【问题描述】:
从以下 2 个场景中,哪一个是在 c# 中进行异步编程的正确方法?
场景一
public async Task<T1> AddSomethingAsync(param)
{
return await SomeOtherFunctionFromThirdPartyLibraryForIOAsync(param);
}
然后
List<Task> Tasks=new List<Task>();
foreach(var task in FromAllTasks())
{
Tasks.Add(AddSomethingAsync(task));
}
await Task.WhenAll(Tasks.AsParallel());
场景 2
public async Task<T1> AddSomethingAsync(param)
{
return SomeOtherFunctionFromThirdPartyLibraryForIOAsync(param);
}
然后
List<Task> Tasks=new List<Task>();
foreach(var task in FromAllTasks())
{
Tasks.Add(SomeOtherFunctionFromThirdPartyLibraryForIOAsync(task));
}
await Task.WhenAll(Tasks.AsParallel());
2 之间的唯一区别是,稍后在 AddSomethingAsync 函数中没有 await 关键字。
所以这里是更新 - 我想知道要实现的是,所有任务都应该并行和异步执行。 (我的想法是在场景 1 中,调用将在 AddSomethingAsync 中等待,并且会在上层阻塞下一个循环执行时受到伤害。确认
【问题讨论】:
-
Tasks.AsParallel?我想你不知道AsParallel做了什么。只需使用await Task.WhenAll(Tasks);。即使您的函数不是真正异步的,AsParallel也为时已晚。 -
@Luaan,你能分享更多关于“迟到”的想法吗?
-
通过在可枚举对象上调用
AsParallel并枚举它,您不会并行化任何东西。只有当您生成的数据是惰性的时,PLINQ 才能为您提供帮助 - 在您的情况下,所有工作都已经完成(调用AddSomethingAsync)。