2016-11-08 90 views
-1

从以下2个场景中,哪一个是在c#中进行异步编程的正确方法?异步 - 其中哪些是正确的

方案-1

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的唯一区别是,后面没有await关键字在AddSomethingAsync函数中。

所以这里是更新 - 我想知道要实现的是,所有任务应该并行和异步执行。 (我的想法是在场景-1,呼叫将内部AddSomethingAsync被期待已久的,并将在上层伤害阻止下一个循环执行。确认

+3

'Tasks.AsParallel'?我不认为你知道'AsParallel'是什么。只需使用'await Task.WhenAll(Tasks);'。即使你的函数不是真正的异步,“AsParallel”对于聚会来说也太晚了。 – Luaan

+0

@Luaan,你能分享一些关于“派对迟到”的更多想法吗? –

+3

你不通过在枚举上枚举并调用'AsParallel'来并行化任何东西。 PLINQ永远只能帮助你,如果你生产的数据是懒 - 你的情况,所有的工作已经完成,已经(调用'AddSomethingAsync')。 – Luaan

回答

6

方案3

public 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也不会做任何事情。

-1

在我看来,它是一样的。 await是一个标记,意思是这行在这个方法的同一个线程中执行,它会在线程中等待。
实际上asyncawait是设计方法返回void。所以如果这个方法不返回结果,它可以单独放在一个线程中。这个方法调用的任何async方法意味着它将使用与void方法相同的线程,如果子方法需要结果await,则它在该线程内部等待。
而当你把它们放在List<Task>时,没有什么区别。

+0

当前方法返回一个对象,但它是没有用的。 –

+0

你需要了解什么情况应该使用'async&await'。我写了一篇博客[这里](http://www.cnblogs.com/xianyudotnet/p/5716908.html)的话,你可以直接跳到'异步和等待和Task'一部分,它不是英语,但你可以检查出实验结果或谷歌翻译。 – Bucketcode