문제

말하자 나는 세 가지 작업 a, b, 고 c.세 가지 모든 보장하는 예외를 임의의 시간에 1~5 초입니다.나는 다음 쓰는 다음과 같은 코드:

await Task.WhenAny(a, b, c);

이것은 궁극적으로 던지는 예외에서 어떤 작업을 결함이 처음이다.터가 존재하지 않기 때문에 try...catch 여기에,이 예외는 것입니다 거품이 일부 다른 곳에서 나의 코드입니다.

무엇 때 일어나 나머지 두 가지 작업을 던지 예외가?지 않는 이러한 관찰되지 않는 예외를 일으키는 원인이 될 것이다,전체 프로세스를 수 있을까요?는 것을 의미하지는 유일한 방법은 사용 WhenAnytry...catch 블록,그리고 어떻게든 관찰한 나머지 두 가지 작업을 계속하기 전까?

Follow-up: 나는 다음과 같이 대답하여 모두 적용됩니다.NET4.5 .NET4.0 비동기를 타겟팅 팩(하지만 명확하게 사용 TaskEx.WhenAny 이 경우).

도움이 되었습니까?

해결책

무엇 때 일어나 나머지 두 가지 작업을 던지 예외가?

Tasks 완료됩니다에서 오류가 발생한 상태입니다.

지 않는 이러한 관찰되지 않는 예외를 일으키는 원인이 될 것이다,전체 프로세스를 수 있을까요?

더 이상 없습니다.

습니다.NET4.0 Task 소멸과의 관찰되지 않는 예외 TaskScheduler.UnobservedTaskException, 는 프로세스를 종료 처리되지 않은 경우.

습니다.NET4.5 이 행동 변경하였.지금,관찰되지 않는 예외로 전달하기 TaskScheduler.UnobservedTaskException, 지만,그들은 무시하면 처리하지 않음.

다른 팁

예, 나머지 작업 예외는 unbServed입니다.Pre .NET 4.5 당신은 그들을 관찰 할 의무가 있습니다 (상황이 어떻게되는지 확실하지는 않지만 변경되었지만 변경됨).

나는 대개 다음과 같은 화재 및 잊어 버린 작업을위한 도우미 방법을 작성합니다.

    public static void IgnoreUnobservedExceptions(this Task task)
    {
        if (task.IsCompleted)
        {
            if (task.IsFaulted)
            {
                var dummy = task.Exception;
            }
            return;
        }

        task.ContinueWith(t =>
            {
                var dummy = t.Exception;
            }, TaskContinuationOptions.OnlyOnFaulted | TaskContinuationOptions.ExecuteSynchronously);
    }
.

프로덕션 앱에 로그인을 포함 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top