"Return"으로 C # Async 메서드를 종료하거나 종료하십시오.
-
21-12-2019 - |
문제
async-await
의 C# 5.0
메소드의 새로운 기능이 있었고, 내 마음에 몇 가지 질문이 있습니다
-
async
메소드가 입력 인수 또는 null 검사에 실패한 경우 -
태스크
return;
메소드에서async
를 사용하는 논리 흐름은 무엇입니까 (어떤 경우에는 무한 루프가되었다) -
는이 시나리오에서
CancellationToken
또는Task.Yield
가 더 적합합니까?
public Func<AzureBlobInfo, string, Task> UploadSuccessCallBackAsync { get; set; }
private async Task OnUploadSuccessAsync(AzureBlobInfo info)
{
if (this.UploadSuccessCallBackAsync == null)
{
return;
}
var transactionType = this.FormData.Get("transactionType");
if (string.IsNullOrEmpty(transactionType))
{
transactionType = "unknown";
}
await this.UploadSuccessCallBackAsync(info, transactionType);
}
.해결책
"일부 문제에 실패"하는 가장 좋은 방법은 적절한 예외를 던지거나, 그러나 을 예외를 피하기를 원하지 않으면 return;
를 확실히 사용할 수 있습니다.
이렇게하면 동 기적으로 완료된 완료된 / 오류가있는 작업이 생성되므로 await
를 사용하는 호출자는 완성 된 작업을 가져 와서 동일한 스레드를 사용하여 계속 진행합니다.
-
CancellationToken
는 호출자 을 허용하여 설명하는 경우가 아닌 작업을 취소합니다.
Task.Yield
는 모든 작업을 종료하지 않으므로 다른 작업을 수행 할 수 있으며 나중에 재조정되도록합니다.
다른 팁
언제든지 Async 메소드에서 안전하게 반환 할 수 있습니다.귀하의 경우에 (작업을 반환하는 메소드) 컴파일러는 종료 된 작업을 생성하므로 함수를 기다리는 호출자가 계속됩니다.
async
메소드에서 예외를 던지면 Task에서 캡처되도록 작업에서 The Task.Wait()
, TaskodiceTagcode를 호출하거나 태스크의 Task.Result
속성에 액세스하여 태스크가 관찰 될 때까지 Throw되지 않습니다.
입력 인수의 관점에서 주위를 둘러싼 방법은 메소드를 두 부분으로 분할하는 것입니다. 첫 번째는 입력 인수를 확인한 다음 Exceptions
인 두 번째 방법을 호출합니다.이 질문에 대한 답변을 Stephen Cleary에 의해 답변하십시오.그렇게하면 입력 인수 예외가 메소드가 반환 한 작업 외부에 곧바로 던져집니다.