2012-11-27 64 views
2

我想轉換應用程序使用任務而不是微軟的多線程框架,但我遇到了錯誤處理的麻煩。從微軟的文檔(http://msdn.microsoft.com/en-us/library/vstudio/0yd65esw.aspx),我希望在try-catch下面來捕獲異常:如何處理任務中的lambda表達式中的異常?

private async void Button1_Click() 
{ 
    try 
    { 
     object obj = await TaskFunctionAsync() 
    } 
    catch(Exception ex) 
    {} 
} 

public Task<object> TaskFunctionAsync() 
{ 
    return Task.Run<object>(() => 
    { 
     throw new Exception("foo"); 
     return new object(); 
    }); 
} 

但是當的button1_Click被激發,我得到的lambda表達式中未處理的異常。有什麼方法可以將異常排除在try-catch之外嗎?我認爲這種錯誤處理(因此你不需要從任務工作者線程編組)是Task框架的主要優點之一。

我也試過:

public async Task<object> TaskFunctionAsync() 
{ 
    return await Task.Run<object>(() => 
     { 
      throw new Exception("foo"); 
      return new object(); 
     }); 
} 

回答

2

但是當的button1_Click被激發,我得到內 lambda表達式

這是不正確的未處理的異常。它由用戶代碼未處理,因爲框架捕獲它,但不完全未處理。繼續運行應用程序以查看該異常將被Button1_Click中的catch捕獲。

+0

...你說得對。謝謝。 – anonWrkrB

+0

有沒有辦法讓它不會拋出lambda表達式(但仍然在Button1_Click內),還是以某種方式更正確地處理它? – anonWrkrB

+1

這是正確的方法。也許你的調試器被設置爲打破所有異常(這通常是件好事)。按下Ctrl-alt-E。 – usr