문제

async-awaitC# 5.0 메소드의 새로운 기능이 있었고, 내 마음에 몇 가지 질문이 있습니다

  1. async 메소드가 입력 인수 또는 null 검사에 실패한 경우

  2. 태스크 return; 메소드에서 async를 사용하는 논리 흐름은 무엇입니까 (어떤 경우에는 무한 루프가되었다)

  3. 는이 시나리오에서 CancellationToken 또는 Task.Yield가 더 적합합니까?

  4. 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에 의해 답변하십시오.그렇게하면 입력 인수 예외가 메소드가 반환 한 작업 외부에 곧바로 던져집니다.

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