2012-09-19 4 views
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으로로드하고이를 처리하기 위해 다른 스레드를 생성하여 처리해야한다고 생각합니다.

답변

0

나는 예외를 블로킹 콜렉션에 넣고 다른 스레드에 타이머를 넣습니다. 주기적으로 예외를 처리합니다. 블로킹 콜렉션에 대한 처리가 끝나지 않는 상황에서는 아주 잘 작동합니다.

0

Btw, 왜 Parallel.Foreach "doSomething"메서드에서 예외를 잡아 내지 못합니까? 물론 로그 파일이나 로그 파일에 대한 액세스를 동기화해야하지만 log4net과 같은 라이브러리는이 작업을 (동기화) 수행합니다.

참고 로깅이 예제 일 뿐이며 이메일을 보낼 때 좀 더 복잡한 논리를 수행하려는 경우 여기에서 살펴볼 수 있습니다. https://gist.github.com/3746240 이것은 "C# 5.0의 생산자/고객 대기열 구현입니다 in the Nutshell : The Definitive Reference ")를 참조하십시오. 우리는 Task를 가지고있어서 잠재적 인 술어와 함께 ContinueWith()를 쉽게 추가 할 수 있습니다 ...

+0

저의 작업은 지연된 서비스 프레임 워크를 사용해야하므로 매우 이상한 일을해야합니다. 결국, 상위 수준에서 예외를 기록하여 처리 할 프레임 워크에 전달할 수 있습니다. –

+0

그냥 내가 참조한 코드를 살펴보고 다음과 같이 Enqueue() 결과를 계속 추가합니다 : pcq.Enqueue() => DoSomething()) ContinueWith ((), HandleException(), TaskContinuationOptions.OnlyOnFaulted) –

+0

as far 제가 말할 수 있듯이, 그것은 끝나지 않은 생산자 소비자 패턴에서 평행선에서 일어날 수있는 예외를 다루지 않습니다. 이론상 오류가 발생하면 메일이 디스크에 저장되고 오류가보고되지만 프로그램은 다음 메일 메시지를 계속 처리합니다. 이 시점에서 나의 주요 관심사는 오류가보고 된 부분이지만 프로그램은 계속됩니다. –

관련 문제