线程池错误捕获

thread pool error trapping

在此处检查最佳实践。

我正在调用 ThreadPool 到 运行 异步进程,特别是发送带有附件的 SSL 电子邮件,这似乎需要很长时间。

这只是测试代码,我想我会把它放在 Try Catch 中以防万一失败。但是线程甚至会回到这里吗?我已经测试了这个关闭网页,浏览器,点击页面上的后退按钮。邮件总能通过。

Try
   System.Threading.ThreadPool.QueueUserWorkItem(AddressOf DoAsyncWork)   '
Catch ex As Exception
   Throw ex
   Exit Sub
 End Try

我不是想强制失败,但我想,但我想知道如果线程失败如何最好地捕获。

Protected Sub DoAsyncWork(ByVal state As Object)   
   Dim oMyObject As New sendSSLemail
   oMyObject.SSL(userName, , strMessageBody, emailAdd, , permFileLocation, , "CodeMsg")
End Sub

使用线程池更方便的方法是使用 Task.Factory.StartNew(Action). It returns a Task object which can be Awaited or blocked on with Wait.

任务完成后,TaskException 属性 可用于确定任务的子例程是否抛出并未处理异常。 (如果不是 Nothing,那么 InnerException 属性 有真正抛出的异常。)

Dim task = Task.Factory.StartNew(AddressOf WorkFunction)
' do stuff that doesn't depend on WorkFunction having completed
task.Wait()
If task.Exception IsNot Nothing Then Throw task.Exception.InnerException

Throw 之后,无论如何都会退出子程序(展开调用堆栈以寻找 Catch),因此 Exit Sub 语句什么都不做。在 try 块中包装 QueueUserWorkItem 调用也什么都不做,因为任何异常都会在另一个线程上发生。你只会得到 QueueUserWorkItem 立即抛出的异常,这在我脑海中只包括对委托 Nothing.

的抱怨

异步任务也可以return取值。有关详细信息,请参阅 the TaskFactory methods that return a Func(Of Task).