2014-12-07 80 views
0

我認爲這是做這類事情的正確方法,但我無法找到明確的文檔,用這麼多的單詞來說明。從另一個異步例程調用異步例程

我有相關的例程,其中例程A對其輸入做一些處理,然後委託給例程B來完成實際的工作。例如,假設我可以根據整數索引或某個值的字符串鍵做一些工作。我可能有一些常規的兩個重載,一個取,是以關鍵指標和一個:

// Do the work based on the int index 
public bool RoutineA(int index) 
{ 
    // Find the key 
    string key = {some function of index}; 

    // Let the other overload do the actual work 
    return RoutineB(key) 
} 

// Do the work based on the string key 
public bool RoutineB(string key) 
{ 
    bool result = {some function of key}; 
    return result; 
} 

現在,假設RoutineB想成爲異步,所以就變成:

// Do the work based on the string key 
public async Task<bool> RoutineB(string key) 
{ 
    bool result = await {some function of key}; 
    return result; 
} 

所以。 ..我的問題是,假設RoutineA在調用RoutineB之前沒有進行自己的異步處理,我可以這樣編碼它。請注意,我不會將例程標記爲async(並且我不調用例程B的await),從而節省了在調用狀態機時構建狀態機的開銷。

// Do the work based on the int index 
public Task<bool> RoutineA(int index) 
{ 
    // Find the key 
    string key = {some function of index}; 

    // Let the other overload do the actual work 
    return RoutineB(key) 
} 

回答

1

好吧,有一個細微的差別。假設找到該鍵的代碼引發異常。在你的第一個代碼中,結果將是一個錯誤的任務。在你的第二段代碼中,異常會立即被拋出給調用者。說實話,哪一個更好取決於你的情況。

但是,除此之外,效果幾乎相同。