2017-05-21 4 views
6

Build2017에서 소개 한 Windows Template Studio의 UWP 앱을 만들었습니다.는 Task.CompletedTask가 무엇을 기다리고 있습니까?

아래의 클래스는 생성 된 코드의 일부입니다.

public class SampleModelService 
{ 
    public async Task<IEnumerable<SampleModel>> GetDataAsync() 
    { 
     await Task.CompletedTask; // <-- what is this for? 
     var data = new List<SampleModel>(); 

     data.Add(new SampleModel 
     { 
      Title = "Lorem ipsum dolor sit 1", 
      Description = "Lorem ipsum dolor sit amet", 
      Symbol = Symbol.Globe 
     }); 

     data.Add(new SampleModel 
     { 
      Title = "Lorem ipsum dolor sit 2", 
      Description = "Lorem ipsum dolor sit amet", 
      Symbol = Symbol.MusicInfo 
     }); 
     return data; 
    } 
} 

내 질문은, 목적과 여기에 await Task.CompletedTask; 코드의 이유는 무엇입니까? 실제로는 Task 결과 수신기가 없습니다.

답변

9

아마 나중에 서명을 변경하지 않고도 비동기 코드 호출을 구현하여 호출 코드를 리팩터링하지 않아도되므로 나중에 단계에서 쉽게 사용할 수 있습니다.

테 메소드 서명에서 async 키워드와 그 줄을 제거하고 인해 구현 예를 들어 인터페이스에 awaitable 작업을 반환해야 할 때 당신은이 구조를 볼

return Task.FromResult<IEnumerable<SampleModel>>(data); 

을 할 것이다 또 다른 옵션 해야 할 비동기 작업이 없습니다.

그러나이 경우 서식 파일이기 때문에 await Task.Completed을 사람이 await FetchDataFromDatabaseAsync();으로 바꿀 것으로 예상됩니다. async 키워드가 이미 있으므로 비동기 호출을 구현하는 데 필요한 변경이 최소화됩니다.

public class SampleModelService 
{ 
    public Task<IEnumerable<SampleModel>> GetDataAsync() 
    { 
     var data = new List<SampleModel>(); 

     data.Add(new SampleModel 
     { 
      Title = "Lorem ipsum dolor sit 1", 
      Description = "Lorem ipsum dolor sit amet", 
      Symbol = Symbol.Globe 
     }); 

     data.Add(new SampleModel 
     { 
      Title = "Lorem ipsum dolor sit 2", 
      Description = "Lorem ipsum dolor sit amet", 
      Symbol = Symbol.MusicInfo 
     }); 

     return Task.FromResult<IEnumerable<SampleModel>>(data); 
    } 
} 

모두에서 작업을 반환 할 필요가 (당신이 어떤 비동기 코드가없는) 그럼 그냥 완전히 제거가없는 경우이없이 어쨌든

, 당신은이 작업을 수행 할 수 있습니다 구성 기다리고 있습니다. (하지만이 메서드를 호출하는 코드를 리팩터링해야합니다.)

이 코드를 검토하면 나중에 개발 프로세스에서 비동기 메서드를 호출하고이 메서드가 Task을 반환하도록 지정하는 것으로 예상됩니다.

+0

"아마도 작업을 반환하지 않아도됩니다." 이제까지 비동기 메소드에서 반환으로 던져서 Task에 랩핑 할 것이므로이 문장이 올바르지 않습니다. – Karolis

+0

당신이 옳습니다, 내 대답을 편집했습니다. –

+0

우리는 'async' 서명을위한 일종의 자리 표시 자라고 말할 수 있습니다. 맞아? – Youngjae

관련 문제