2017-09-01 63 views
0

以下哪一項是使用異步等待的最佳方式。異步一路向下VS異步在頂層

選項1:異步等待中的所有功能

public async Task A() 
{ 
    await B(); 
    //some code 
} 

public async Task<bool> B() 
{ 
    var result= await C(); 
    //some code 
    return result; 
} 

public Task<bool> C() 
{ 
    // not implemnted 
} 

OR

選項2:異步中僅頂層功能

public async Task A() 
    { 
     await B(); 
     //some code 
    } 

    public async Task<bool> B() 
    { 
     var result= C().Result; 
     //some code 
     return result; 

    } 

    public Task<bool> C() 
    { 
     // not implemnted 
    } 

回答

5

選項1是等待不要做正確的做法和2。如果您在callstack中的任何位置使用異步,則絕不應在代碼中調用.Result.Wait()。如果你這樣做,很可能你最終會使你的程序陷入僵局。

UPDATE:在一個側面說明,如果函數B的代碼不依賴於正在啓動該功能(沒有用戶界面的工作)「最好」的方式做同一個線程這將是

public async Task A() 
{ 
    await B(); 
    //some code that interacts with the UI 
} 

public async Task<bool> B() 
{ 
    var result= await C().ConfigureAwait(false); 
    //some code does does not interact with the UI 
    return result; 
} 

public Task<bool> C() 
{ 
    // not implemnted 
} 

這使得系統可以使用任何可用的線程池線程,而不是等待同步上下文在運行延續時變爲可用。

+0

編輯我的問題...在功能B我必須做一些基於結果的處理 –

+0

函數B中的代碼是否以任何方式依賴於用戶界面?如果沒有,我更新了我的答案以顯示更好的方法。 –

+0

沒有。不需要UI上下文 –