다음 과 같이 예외 (스택 추적 포함)를 다시 던지기 전에 블록 async
에서 메서드 를 호출해야합니다 catch
.
try
{
// Do something
}
catch
{
// <- Clean things here with async methods
throw;
}
그러나 불행히도 당신은 또는 블록 await
에서 사용할 수 없습니다 . 나는 컴파일러가 당신의 명령이나 그와 비슷한 것을 실행하기 위해 블록으로 돌아갈 방법이 없기 때문에 배웠습니다 ...catch
finally
catch
await
Task.Wait()
교체 에 사용하려고했는데 await
교착 상태가 발생했습니다. 나는 이것을 피할 수있는 방법을 웹에서 검색했고이 사이트를 찾았다 .
async
메서드를 변경할 수 없고을 사용하는지 알 수 없기 때문에 다른 스레드 (교착 상태를 피하기 위해)에있을 때 비동기 메서드를 시작하고 완료를 기다리는 ConfigureAwait(false)
a Func<Task>
를 사용하는 다음 메서드를 만들었습니다 .
public static void AwaitTaskSync(Func<Task> action)
{
Task.Run(async () => await action().ConfigureAwait(false)).Wait();
}
public static TResult AwaitTaskSync<TResult>(Func<Task<TResult>> action)
{
return Task.Run(async () => await action().ConfigureAwait(false)).Result;
}
public static void AwaitSync(Func<IAsyncAction> action)
{
AwaitTaskSync(() => action().AsTask());
}
public static TResult AwaitSync<TResult>(Func<IAsyncOperation<TResult>> action)
{
return AwaitTaskSync(() => action().AsTask());
}
제 질문은 :이 코드가 괜찮다고 생각하십니까?
물론 개선 사항이 있거나 더 나은 접근 방식을 알고 있다면 듣고 있습니다! :)
await
catch 블록에서 사용 하는 것은 실제로 C # 6.0 이후로 허용됩니다 (아래 내 답변 참조)