4

제가현재 장애가 발생해도 대기열에서 다른 작업을 계속하는 방법은 무엇입니까?

private static void ExecuteOnTaskFailure(Task previousTask) 
{ 
    if (!previousTask.IsFaulted) 
     return; 

    if (previousTask.Exception != null && previousTask.Exception.InnerExceptions != null) 
     foreach (var exception in previousTask.Exception.InnerExceptions) 
     { 
      Logger.Error("Task failed continued to the next task : " + exception.Message, exception); 
     } 
} 

이 그다지 작업은 다음과 같이 메소드가 정의 ExecuteOnTaskFailure

Queue 
    .GetConsumingEnumerable() 
    .ToObservable() 
    .Select(x => x.ObserveOn(NewThreadScheduler.Default)) 
    .SubscribeOn(NewThreadScheduler.Default) 
    .Subscribe(
     grp => grp.ForEachAsync(b => b.Execute()) 
        .ContinueWith(ExecuteOnTaskFailure, TaskContinuationOptions.OnlyOnFaulted)); 

아래와 같이 대기열을 실행하는 코드를 갖는다. 나는 대기열에서 작업을 실행하는 데 실패하더라도 하나의 작업을 계속 실행하는 방법을 알아낼 수 없습니다. 또한 대기열 끝에이 실패한 작업을 재구성 할 수있는 방법이 있습니까?

여기에 도움을 주시면 감사하겠습니다.

그것은 당신이 원하는 것을 같은 소리

답변

1

try입니다 - 당신의 루프에서 catch : 그것은 블록 (그 이름에서 알 수 있듯이) 비어 때 때문에

grp.ForEachAsync(async b => 
{ 
    try 
    { 
     await b.Execute(); 
    } 
    catch (Exception ex) 
    { 
     Logger.Error(ex); 
     Queue.Add(b); 
    } 
}) 

그러나 BlockingCollection은 매우 비동기 친화적하지 않습니다. 다른 접근법을 고려할 수도 있습니다.

+0

+1 답장을 보내고 시도하십시오! 결국 결국이 게시물을 업데이트 할 시간이 없었습니다. –