消费者生产者与阻止集合异常处理

时间:2012-09-19 14:06:02

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

这种情况总是有很多工作要做,因为总有一组电子邮件需要处理。我想确保记录parallel.foreach中产生的任何异常。我发现的示例都等到队列(在本例中为MailToDownload)完成后才能处理异常。在我的情况下,我该如何处理异常?

下面是我如何编写方法的基本示例。第一个任务是从数据库中提取要删除的电子邮件列表。每次电子邮件帐户收到邮件时,电子邮件地址都会插入到表格中,因此始终有数据。

Sub Main()
    Dim MailToDownload As New BlockingCollection(Of myMail)

    Task.Factory.StartNew(Sub()
                            For i As Integer = 0 To 99
                                MailToDownload.Add(New myMail With {.id = i})
                                System.Threading.Thread.Sleep(1000)
                            Next
                          End Sub)

    Task.Factory.StartNew(Sub()
                            Dim options As ParallelOptions = New ParallelOptions With {.MaxDegreeOfParallelism = 16}
                            Parallel.ForEach(MailToDownload.GetConsumingPartitioner(), options, Sub(item) doSomething(item))
                          End Sub)
End Sub

我想我应该通过将所有异常加载到另一个阻塞集合中来处理所有异常并生成一个不同的线程来处理它们。

2 个答案:

答案 0 :(得分:0)

顺便问一下,为什么不在Parallel.Foreach“doSomething”方法中捕获该异常? 当然你必须同步访问日志文件或其他什么,但像log4net这样的库为你做这个(同步)。

仅供参考,如果日志记录只是一个示例,并且您希望在发送电子邮件的某些条件下执行更复杂的逻辑,则可以在此处查看:https://gist.github.com/3746240 这是生产者/消费者队列实现(来自Nutshell中的“C#5.0:最终参考”),它包含了Tasks中的所有作业。由于我们有Task,你可以轻松地将ContinueWith()附加到潜在谓词,只有在出现错误时才需要调用它...

答案 1 :(得分:0)

我最终将异常放入阻塞集合中,并在另一个线程中放置一个定时器来定期处理异常。它在阻塞集合的处理永远不会结束的情况下运行良好。