在此检查最佳做法。
我正在调用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
答案 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)
。