我已经阅读了几篇关于在 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
则永远不会调用。那我该怎么做呢?
注意:我不打算像这样留下我的生产代码,上面的代码示例只是我试图解决的问题的简化测试用例。在实际应用中,异常会得到妥善处理。