2015-10-26 235 views
0

我目前調用async方法,不想await它。我不需要async方法的結果,也不希望在IO期間阻塞。但是,如果在async方法中出現錯誤,我想catch吧。到目前爲止,我有:調用異步方法而不等待

public static void main() { 
    MyAsyncMethod(). 
    ContinueWith(t => Console.WriteLine(t.Exception), 
      TaskContinuationOptions.OnlyOnFaulted); 
    //dostuff without waiting for result 
} 

這不是趕上從MainMyAyncMethod引發的異常。有什麼我做錯了嗎?

+0

有沒有try-catch塊...? – Tim

+0

如果它「不捕捉異常」會發生什麼? – i3arnon

+0

我認爲Continuewith會「捕捉」異常。至少,這是我讀的,但目前我的代碼崩潰 – user3750474

回答

1

async-await和ContinueWith可以工作,但它充滿了頭痛。將錯誤處理重構爲一個方法並將其放入該方法非常簡單,然後您可以從主方法調用該新方法。

public static void main() { 
    var task = DoMyAsyncMethod(); 

    //dostuff without waiting for result 

    //Do a wait at the end to prevent the program from closing before the background work completes. 
    task.Wait(); 

} 

private static async Task DoMyAsyncMethod() 
{ 
    try 
    { 
     await MyAsyncMethod(); 
    } 
    catch (Exception e) 
    { 
     Console.WriteLine(e); 
    } 
} 

我懷疑你是在處理真正的問題是,缺少Wait()和程序之前您的後臺工作收盤本身是做處理。

+0

我們的程序將永遠在服務器上運行,所以我們永遠不會等待。這不會在DoMyAsyncMethod中阻塞嗎? – user3750474

+0

不,當你點擊'await'時,'DoMyAsyncMethod'函數會重新調用'Task'對象,它不會阻塞。這取決於你想用這個'Task'來完成,等待它,扔掉它,沒關係。 'await'實際上只是一個用'ContinueWith'完成工作的簡單方法,它可以讓你用寫同步代碼的方式編寫異步代碼(例如,使用try/catch而不是'ContinueWith(SomeMethod,TaskContinuationOptions .OnlyOnFaulted)')。 –