【问题标题】:consumer producer with blocking collection exception handling具有阻塞收集异常处理的消费者生产者
【发布时间】:2012-10-04 21:44:52
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 因为我的工作需要我们使用一个智障服务框架,所以我不得不做一些很奇怪的事情。最后,我试图在顶层记录我的异常,以便我可以将其传递给框架进行处理。
    • 看看我引用的代码并将延续附加到 Enqueue() 结果如下:pcq.Enqueue(()=>DoSomething()).ContinueWith(()=>HandleException(), TaskContinuationOptions.OnlyOnFaulted)
    • 据我所知,这并没有解决在没有结束的生产者消费者模式中的 parallel.foreach 中发生的异常。理想情况下,如果发生错误,将邮件保存到磁盘,报告错误,但程序会继续处理下一封邮件。在这一点上,我主要关心的是报告错误的部分,但程序仍在继续。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-25
      • 2014-02-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多