我已经阅读了几篇关于在TPL中处理异步异常的文章,其中大多数建议使用async / await关键字和一个常规的Try / Catch块。我现在一直坚持使用VS-2010和.NET 4.0,所以我尝试了这段代码:
Imports System.Threading.Tasks
Public Class frmMain
Private Sub frmMain_Load(sender As System.Object,
e As System.EventArgs) Handles MyBase.Load
Dim t As New Task(AddressOf DoWork)
Dim t2 As Task = t.ContinueWith(AddressOf MyExceptionHandler,
TaskContinuationOptions.OnlyOnFaulted)
t.Start()
End Sub
Private Sub MyExceptionHandler(t As Task)
t.Exception.Handle(Function(e As Exception) True) 'ignore all exceptions
End Sub
Private Sub DoWork()
Throw New Exception("Error happened")
End Sub
End Class
如果我执行t.Start()
,如上所述,它永远不会到达MyExceptionHandler
,只会在DoWork
中抛出未处理的异常。如果我改为呼叫t2.Start()
,则永远不会调用DoWork
。那我该怎么办?
注意:我不打算像这样留下我的生产代码,上面的代码示例只是我试图解决的问题的简化测试用例。在实际应用程序中,将正确处理异常。