Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 线程池错误捕获_Vb.net_Threadpool - Fatal编程技术网

Vb.net 线程池错误捕获

Vb.net 线程池错误捕获,vb.net,threadpool,Vb.net,Threadpool,在这里查看最佳实践 我正在调用一个线程池来运行一个异步进程,特别是发送一封带有附件的SSL电子邮件,这似乎需要很长时间 这只是测试代码,我想我会把它放在一个Try-Catch中,以防失败。但是线还会回到这里吗?我已经在关闭网页、浏览器、单击页面上的“后退”按钮时对此进行了测试。电子邮件总是能通过 Try System.Threading.ThreadPool.QueueUserWorkItem(AddressOf DoAsyncWork) ' Catch ex As Exception

在这里查看最佳实践

我正在调用一个线程池来运行一个异步进程,特别是发送一封带有附件的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

使用线程池更方便的方法是使用。它返回一个
任务
对象,该对象可以被
等待
启用或阻止

任务完成后,
任务
异常
属性可用于确定任务的子例程是否引发和未处理异常。(如果不是
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