처리 할 전자 메일 큐가 항상 있기 때문에 더 많은 작업이 항상 필요한 상황입니다. 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으로로드하고이를 처리하기 위해 다른 스레드를 생성하여 처리해야한다고 생각합니다.
저의 작업은 지연된 서비스 프레임 워크를 사용해야하므로 매우 이상한 일을해야합니다. 결국, 상위 수준에서 예외를 기록하여 처리 할 프레임 워크에 전달할 수 있습니다. –
그냥 내가 참조한 코드를 살펴보고 다음과 같이 Enqueue() 결과를 계속 추가합니다 : pcq.Enqueue() => DoSomething()) ContinueWith ((), HandleException(), TaskContinuationOptions.OnlyOnFaulted) –
as far 제가 말할 수 있듯이, 그것은 끝나지 않은 생산자 소비자 패턴에서 평행선에서 일어날 수있는 예외를 다루지 않습니다. 이론상 오류가 발생하면 메일이 디스크에 저장되고 오류가보고되지만 프로그램은 다음 메일 메시지를 계속 처리합니다. 이 시점에서 나의 주요 관심사는 오류가보고 된 부분이지만 프로그램은 계속됩니다. –