c# – 非同步一直下來?
嘗試瞭解新的非同步/等待模式,我有一個問題,我找不到答案,即如果我應該使用非同步來裝飾我的方法,如果我打算從其他非同步函式呼叫這些方法,或者只是返回任務在適當情況下?
換句話說,這些A,B或C中哪一個是最好的,為什麼?
class A<T> { public async Task<T> foo1() //Should be consumed { return await foo2(); } public async Task<T> foo2() //Could be consumed { return await foo3(); } private async Task<T> foo3() //Private { return await Task.Run(...); } } class B<T> { public async Task<T> foo1() //Should be consumed { return await foo2(); } public async Task<T> foo2() //Could be consumed { return await foo3(); } private Task<T> foo3() //Private { return Task.Run(...); } } class C<T> { public async Task<T> foo1() //Should be consumed { return await foo2(); } public Task<T> foo2() //Could be consumed { return foo3(); } private Task<T> foo3() //Private { return Task.Run(...); } }
對於重新排列方法來說似乎是多餘的,所以我自然地傾向於C,但是同時使用Task T來感覺有點尷尬.除非您使用await關鍵字.
兩個版本的工作效果都是一樣的,唯一的區別是,當你在這裡等待時,你會得到一些效能損失(因為狀態機必須被設定,並且可能會使用延續).
所以歸結於一個權衡:你希望你的方法有一些更有效率,而不是以較少的可讀性為代價?還是願意犧牲表現才能閱讀?
通常,我建議你先去可讀性,只關注效能,如果分析告訴你是值得的.但在這種情況下,我認為可讀性的增加很小,所以我可能不會等待.
還要注意,你的類C仍然不夠遠:foo1()也不需要等待.
http://stackoverflow.com/questions/12016322/async-all-the-way-down