线程池错误捕获

时间:2015-04-24 20:30:30

标签: vb.net threadpool

在此检查最佳做法。

我正在调用ThreadPool来运行Async进程,特别是发送带有附件的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

1 个答案:

答案 0 :(得分:1)

使用线程池的更方便的方法是使用Task.Factory.StartNew(Action)。它会返回一个Task对象,Await可以使用Wait进行Exception或阻止。

任务完成后,Task的{​​{1}}属性可用于确定异常是否被任务的子例程抛出和未处理。 (如果它不是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的投诉。

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