TPL中的异常处理

时间:2015-02-09 11:44:27

标签: vb.net multithreading task-parallel-library

我使用以下代码创建一些文件。

我观察到有时候如果发生了一些异常,所有Parallel.For线程都会停止。

我几乎没有问题。

  1. 我是否应该在CreateReport方法或其@rt位置使用AggregateException。

  2. 如何确保在任何线程中出现异常时,它不会阻止其他并行线程。

  3.     Try
                dtScheduledReports = objReprotHelper.GetTopImmediateReportsForExecution()
    
            Parallel.For(0, dtScheduledReports.Rows.Count, Sub(i)
                                                               CreateReport(dtScheduledReports.Rows(i))
                                                           End Sub)
        Catch ae As AggregateException
            For Each ex As Exception In ae.InnerExceptions
                ExceptionHandler.LogError(ex)
            Next
        End Try
    
    Private Sub CreateReport(dtRow As DataRow, scheduleType As Integer)
            Try
                  //do something
            Catch 
                  throw
            End Try
        End Sub
    

1 个答案:

答案 0 :(得分:0)

您可以使用ConcurrentQueue(Of Exception)启用来自多个线程的安全异常入队。这允许执行整个循环并抛出AggregateException中的所有异常。

Private Sub DoAParalelJobAndThrowErrors

  Dim exQueue as New ConcurrentQueue(Of Exception)
  dtScheduledReports = objReprotHelper.GetTopImmediateReportsForExecution()
  // Execute the complete loop and capture all exceptions.
  Parallel.For(0, dtScheduledReports.Rows.Count, Sub(i)
                                                       Try
                                                         CreateReport(dtScheduledReports.Rows(i))
                                                       Catch ex as Exception
                                                         exQueue.Enqueue(ex)
                                                       End Try
                                                     End Sub)

  If exQueue.count > 0 throw new AggregateException(exQueue)

End Sub

Private Sub CreateReport(dtRow As DataRow, scheduleType As Integer)       
    //do something
End Sub

根据MSDN,这种方式不会中断循环,所有行都应该被处理。