Vb.net 线程池错误捕获
在这里查看最佳实践 我正在调用一个线程池来运行一个异步进程,特别是发送一封带有附件的SSL电子邮件,这似乎需要很长时间 这只是测试代码,我想我会把它放在一个Try-Catch中,以防失败。但是线还会回到这里吗?我已经在关闭网页、浏览器、单击页面上的“后退”按钮时对此进行了测试。电子邮件总是能通过Vb.net 线程池错误捕获,vb.net,threadpool,Vb.net,Threadpool,在这里查看最佳实践 我正在调用一个线程池来运行一个异步进程,特别是发送一封带有附件的SSL电子邮件,这似乎需要很长时间 这只是测试代码,我想我会把它放在一个Try-Catch中,以防失败。但是线还会回到这里吗?我已经在关闭网页、浏览器、单击页面上的“后退”按钮时对此进行了测试。电子邮件总是能通过 Try System.Threading.ThreadPool.QueueUserWorkItem(AddressOf DoAsyncWork) ' Catch ex As Exception
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
使用线程池更方便的方法是使用。它返回一个
任务
对象,该对象可以被等待
启用或阻止
任务完成后,任务
的异常
属性可用于确定任务的子例程是否引发和未处理异常。(如果不是Nothing
,则InnerException
属性具有引发的实际异常。)
在抛出后,sub仍将退出(调用堆栈将展开以查找捕获
),因此Exit sub
语句不会执行任何操作。在try块中包装一个QueueUserWorkItem
调用也不起任何作用,因为任何异常都会发生在另一个线程上。您只会得到QueueUserWorkItem
立即抛出的异常,这在我的脑海中只包含了关于代理是Nothing
的抱怨
异步任务也可以返回值。有关这方面的更多信息,请参见。出于好奇,您正在运行什么框架版本?捕获异常,不处理它,然后使用Throw ex
重新触发它有什么意义?QUWI抛出异常的几率为零。您必须在DoAsyncWork()中处理它。这永远是令人讨厌的,火灾和遗忘是很难处理的,例外情况不会让你忘记。请考虑使用后台工作人员或任务,这样您就可以很容易地将故障恢复到UI线程。我希望我能给你更多的分数。这正是我需要的解决方案。
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