线程池错误捕获
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 Await
ed or blocked on with Wait
.
任务完成后,Task
的 Exception
属性 可用于确定任务的子例程是否抛出并未处理异常。 (如果不是 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)
.
在此处检查最佳实践。
我正在调用 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 Await
ed or blocked on with Wait
.
任务完成后,Task
的 Exception
属性 可用于确定任务的子例程是否抛出并未处理异常。 (如果不是 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)
.