2013-08-22 33 views
0

所以我有一個UI線程。人點擊一些東西,因爲他們喜歡它。所以點擊觸發一些函數調用。其中一個潛在的函數調用使用CDROM驅動程序,通過嘗試幾次讀取髒盤並使其發生瘋狂的砰砰聲。在引發異常的異步期間維護重試狀態

所以我想要一個響應式的用戶界面,我把我的函數調用等待。所以當用戶點擊時,函數會將控制權交給UI線程。函數嘗試讀取CDROM,但它非常髒,所以它向調用者拋出異常。該調用者計算重試次數並繼續嘗試三次。

所以,如果這一切都在等待,我在哪裏保持計數?

如果我將計數保持在較低的水平,並且該水平隨着等待而放棄,那麼它將無法繼續重試直到三次嘗試,因爲它是REL RELATED。

但是,如果我不放棄,我無法保持響應式用戶界面。

我是否將計數保存在Task對象中?並且究竟哪個線程/等待級別可以負責檢查重試計數?

回答

0

你可以把你的重試邏輯放在最合適的地方。 await作品完美地與try

public async Task PerformOperationAsync(int retries) 
{ 
    while (retries != 0) 
    { 
    try 
    { 
     await PerformSingleOperationAsync(); 
     return; 
    } 
    catch (Exception ex) 
    { 
     Log(ex); 
     --retries; 
    } 
    } 
} 

如果超出重試上面的代碼會忽略失敗。您也可以拋出的最後一個錯誤:

public async Task PerformOperationAsync(int retries) 
{ 
    while (true) 
    { 
    try 
    { 
     await PerformSingleOperationAsync(); 
     return; 
    } 
    catch (Exception ex) 
    { 
     Log(ex); 
     if (--retries == 0) 
     throw; 
    } 
    } 
} 

拋出的第一個錯誤或所有錯誤的集合就留給讀者自己練習。 ;)

+0

所以如果所有的重試都用盡了,我該怎麼辦? ....如果等待成功,它將執行任務對象中的回調指針。如果這個級別的函數確定await已經嘗試了足夠多的話,它是如何指示/中斷的;呼叫者? This.oTask.failed? –

+0

你可以做任何你想做的事情。我發佈的代碼只是放棄(沒有錯誤),如果重試都用完了。如果你願意,你可以選擇重新拋出異常。 –

+0

UI線程可以中止while循環嗎?假設用戶決定他應該去購買另一個磁盤副本。 –