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

すべての例外を別のblockingcollectionにロードして処理し、それらを処理するために別のスレッドを生成する必要があると考えています。

4

2 に答える 2

0

私は例外をブロッキングコレクションに入れ、定期的に例外を処理するためにタイマーを別のスレッドに入れました。ブロッキング コレクションの処理が終わらない状況では、非常にうまく機能します。

于 2012-10-04T13:44:52.943 に答える
0

ところで、その Parallel.Foreach の「doSomething」メソッドでその例外をキャッチしないのはなぜですか? 確かに、ログファイルなどへのアクセスを同期する必要がありますが、log4net などのライブラリがこれ (同期) を行います。

参考までに、ロギングが単なる例であり、電子メールの送信時に特定の条件下でより複雑なロジックを実行したい場合は、https ://gist.github.com/3746240 を参照してください。 これはプロデューサー/コンシューマー キューの実装です (本「C# 5.0 in a Nutshell: The Definitive Reference」から) すべてのジョブをタスクにラップします。Task があるので、エラーが発生した場合にのみ呼び出す必要がある潜在的な述語を含む ContinueWith() を簡単に追加できます...

于 2012-09-19T14:47:08.153 に答える