在Try / Catch块中提交的循环任务

时间:2018-04-14 17:30:15

标签: vb.net asynchronous try-catch task

我有一个处理一个或多个计划任务的后台任务“提交者”:

...
While sdr.read()
    ...
    Dim oBackground As New Background
    Task.Run(Sub() CallByName(oBackground, sProcessKey, CallType.Method, iPQID))
End While

在你问之前,是的,任务是线程安全的。 :)

我希望提交者在任务运行时结束(回去睡觉);等待下一次心跳,但我需要捕获并处理每个线程中的异常。

我能做到这一点的唯一方法是为每个后台作业创建一个新任务并在那里处理异常,但这似乎效率低下:

为每个后台作业创建新任务,然后提交实际作业并等待发现错误并处理它:

Private Sub NewJob(sProcessKey, iPQID)
    Dim t As Task
    ....
    While sdr.read()
        ...
        Dim oBackground As New Background
        t = Task.Run(Sub() CallByName(oBackground, sProcessKey, CallType.Method, iPQID))
        Try
            t.Wait()
        Catch ex As AggregateException 
            For Each IEx As Exception In ex.InnerExceptions
                HandleBackgroundException(IEx, sProcessKey)
            Next
        End Try
    End While
End Sub

有没有更好的方法呢?

谢谢!

1 个答案:

答案 0 :(得分:0)

我相信我已经找到了自己问题的答案。

由于每个任务都是自己的线程,因此不需要额外的线程提交。

任务直接运行,错误处理在任务中发生,如上所示(但没有等待')。因此:

Public Shared Sub MyTask()
    Try
        ... do some work here ...
    Catch ex As AggregateException
        For Each IEx As Exception In ex.InnerExceptions
            HandleBackgroundException(IEx, sProcessKey)
        Next
    End Try
End Sub

那就是它!

我希望这有助于其他人。