2016-11-08 43 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

相關問題