我正在创建很多这样的任务:
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 :(得分: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
时才会抛出异常