작업입니다.WhenAny 및 관찰되지 않는 예외
-
12-12-2019 - |
문제
말하자 나는 세 가지 작업 a
, b
, 고 c
.세 가지 모든 보장하는 예외를 임의의 시간에 1~5 초입니다.나는 다음 쓰는 다음과 같은 코드:
await Task.WhenAny(a, b, c);
이것은 궁극적으로 던지는 예외에서 어떤 작업을 결함이 처음이다.터가 존재하지 않기 때문에 try...catch
여기에,이 예외는 것입니다 거품이 일부 다른 곳에서 나의 코드입니다.
무엇 때 일어나 나머지 두 가지 작업을 던지 예외가?지 않는 이러한 관찰되지 않는 예외를 일으키는 원인이 될 것이다,전체 프로세스를 수 있을까요?는 것을 의미하지는 유일한 방법은 사용 WhenAny
의 try...catch
블록,그리고 어떻게든 관찰한 나머지 두 가지 작업을 계속하기 전까?
Follow-up: 나는 다음과 같이 대답하여 모두 적용됩니다.NET4.5 고 .NET4.0 비동기를 타겟팅 팩(하지만 명확하게 사용 TaskEx.WhenAny
이 경우).
해결책
무엇 때 일어나 나머지 두 가지 작업을 던지 예외가?
그 Task
s 완료됩니다에서 오류가 발생한 상태입니다.
지 않는 이러한 관찰되지 않는 예외를 일으키는 원인이 될 것이다,전체 프로세스를 수 있을까요?
더 이상 없습니다.
습니다.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);
}
.
프로덕션 앱에 로그인을 포함 할 수 있습니다.