0

在这种情况下,总是有更多工作要做,因为总是有一系列电子邮件要处理。我想确保将记录 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

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

4

2 回答 2

0

顺便说一句,你为什么不在 Parallel.Foreach “doSomething”方法中捕捉到那个异常?当然,您必须同步对日志文件或其他任何内容的访问,但是像 log4net 这样的库会为您执行此操作(同步)。

仅供参考,如果日志记录只是一个示例,并且您希望在发送电子邮件时在某些条件下执行更复杂的逻辑,您可以在这里查看:https ://gist.github.com/3746240 这是生产者/消费者队列实现(摘自“C# 5.0 in a Nutshell: The Definitive Reference”一书,它将所有作业包装在 Tasks 中。由于我们有任务,您可以轻松地将 ContinueWith() 附加潜在谓词,即仅在出现错误时才必须调用它...

于 2012-09-19T14:47:08.153 回答
0

我最终将异常放入阻塞集合中,并在另一个线程中放置了一个计时器以定期处理异常。它在阻塞集合的处理永远不会结束的情况下工作得很好。

于 2012-10-04T13:44:52.943 回答