2016-03-13 105 views
0

我創建像這樣的很多任務:異步任務消失

Public Sub RequestAsync() 
    Dim wc As New Net.WebClient 
    CompleteTask = wc.DownloadStringTaskAsync(GetUrl()) 
    Dim CompleteAction As Action(Of Tasks.Task(Of String)) = AddressOf CompleteAsync 
    CompleteTask.ContinueWith(CompleteAction) 
End Sub 

而且我跟蹤的多少併發任務有(本次外),限制他們10.當我調用RequestAsync(),我遞增計數器,當調用CompleteAction時,它遞減計數器。

其中99.98%正確完成,有些預計會由於網絡故障而失敗,在這種情況下,它們會被重新安排。然而,其餘的0.02%消失,並且再也沒有被聽到。據我所知,他們的線程已完成,但他們從來沒有調用CompleteAction。

這是正常的行爲嗎?有什麼方法可以保證當任務變得嘔吐時我會收到通知?

回答

0

您需要始終遵守Task以瞭解可能的例外情況。
使用Await關鍵字將任務展開到底層結果。
當您使用Await代碼執行將被移至RequestAsync方法的調用方,並在DownloadStringTaskAsync完成時返回此處。
你的方法更改爲Async

Public Async Function RequestAsync() As Task 
    Dim wc As New Net.WebClient 
    Dim result As String = Await wc.DownloadStringTaskAsync(GetUrl()) 
    'Check for result here 
End Function 

Task包裝加工過程中和在AggregateException實例所有異常發生。
僅當觀察到Task時纔會拋出異常