[c#] C #에서 "return await"의 목적은 무엇입니까?



Answers

async 가 필요하지 않은 경우 (즉, Task 직접 반환 할 수있는 경우) async 사용하지 마십시오.

다음과 같은 두 가지 비동기 작업이있는 경우와 같이 return await 가 유용 할 수 있습니다.

var intermediate = await FirstAsync();
return await SecondAwait(intermediate);

async 성능에 대한 자세한 내용은 Stephen Toub의 MSDN 기사video참조하십시오 .

업데이트 : 블로그 게시물 을 작성하여 훨씬 자세하게 설명합니다.

Question

다음과 같은 작성 방법이 있습니다.

public async Task<SomeResult> DoSomethingAsync()
{
    // Some synchronous code might or might not be here... //
    return await DoAnotherThingAsync();
}

대신이 :

public Task<SomeResult> DoSomethingAsync()
{
    // Some synchronous code might or might not be here... //
    return DoAnotherThingAsync();
}

말이 되겠습니까?

내부 DoAnotherThingAsync() 호출에서 Task<T> 를 직접 반환 할 수있는 경우 return await 사용하는 이유는 무엇입니까?

나는 많은 곳에서 return await 있는 코드를보고, 뭔가 놓쳐 야한다고 생각한다. 그러나 내가 이해하는 한,이 경우에는 async / 키워드를 기다리지 않고 Task를 직접 반환하는 것이 기능적으로 동일합니다. 추가 await 오버 헤드를 추가하는 이유는 무엇입니까?




이것은 또한 나 혼란스럽고 나는 이전의 대답이 실제 질문을 간과했다고 생각한다 :

내부 DoAnotherThingAsync () 호출에서 Task를 직접 반환 할 수있는 경우 return을 사용하는 이유는 무엇입니까?

가끔은 실제로 Task<SomeType> 이라는 Task<SomeType> 원하지만 실제로는 SomeType 의 인스턴스, 즉 작업의 결과를 원할 때가 대부분입니다.

귀하의 코드에서 :

async Task<SomeResult> DoSomethingAsync()
{
    using (var foo = new Foo())
    {
        return await foo.DoAnotherThingAsync();
    }
}

구문에 익숙하지 않은 사람 (예를 들어)은이 메서드가 Task<SomeResult> 반환해야한다고 생각할 수 있지만 async 로 표시되기 때문에 실제 반환 형식이 SomeResult 임을 의미합니다. return foo.DoAnotherThingAsync() 를 사용하면 컴파일되지 않는 Task가 반환됩니다. 올바른 방법은 작업 결과를 반환하는 것이므로 return await .




결과를 기다리는 또 다른 경우는 다음과 같습니다.

async Task<IFoo> GetIFooAsync()
{
    return await GetFooAsync();
}

async Task<Foo> GetFooAsync()
{
    var foo = await CreateFooAsync();
    await foo.InitializeAsync();
    return foo;
}

이 경우 GetIFooAsync()GetFooAsync 결과를 기다려야합니다. 두 메서드간에 T 유형이 다르며 Task<Foo>Task<IFoo> 직접 할당되지 않기 때문입니다. 그러나 결과를 기다리고 있다면 IFoo 직접 할당 할 수있는 Foo 됩니다. 그런 다음 비동기 메서드는 Task<IFoo> 내부의 결과를 다시 패키지하기 만하면됩니다.






Links