我使用以下代码创建一些文件。
我观察到有时候如果发生了一些异常,所有Parallel.For线程都会停止。
我几乎没有问题。
我是否应该在CreateReport方法或其@rt位置使用AggregateException。
如何确保在任何线程中出现异常时,它不会阻止其他并行线程。
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
答案 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,这种方式不会中断循环,所有行都应该被处理。