키워드가없는 것은 어떻습니까?
컴파일러가 비동기 메소드를 호출 할 때 그 결과를 원한다는 것을 깨닫기를 원합니다.
Document doc = DownloadDocumentAsync();
그게 다야. 사람들이이 문제에 대한 키워드를 생각하는 데 어려움을 겪는 이유는 "일이 완벽하게 정상적으로 이루어 졌다면 할 일"에 대한 키워드를 가지고 있기 때문입니다. 이것이 기본값이어야하며 키워드는 필요하지 않습니다.
최신 정보
필자는 원래 컴파일러가 수행해야 할 작업을 파악하기 위해 형식 유추로 영리해야한다고 제안했습니다. 이것에 대해 더 생각하면 CTP에서 기존 구현을 그대로 유지하지만 몇 가지 간단한 추가를 수행하여 await
키워드를 명시 적으로 사용해야하는 경우를 줄 입니다.
우리는 속성을 발명합니다 : [AutoAwait]
. 이것은 메소드에만 적용 할 수 있습니다. 이것을 메소드에 적용하는 한 가지 방법은이를 표시하는 것 async
입니다. 그러나 직접 수행 할 수도 있습니다. 예 :
[AutoAwait]
public Task<Document> DownloadDocumentAsync()
그런 다음 모든 async
메소드에서 컴파일러는에 대한 호출을 기다리고 있다고 가정 DownloadDocumentAsync
하므로 지정할 필요가 없습니다. 해당 메소드를 호출하면 자동으로 대기합니다.
Document doc = DownloadDocumentAsync();
이제, "영리하게"하고를 얻으려면 Task<Document>
operator를 사용하면 start
메소드 호출 전에 만 표시 될 수 있습니다.
Task<Document> task = start DownloadDocumentAsync();
깔끔합니다. 이제 일반 메소드 호출은 일반적으로 의미하는 바를 의미합니다. 메소드가 완료 될 때까지 기다리십시오. 그리고 start
다른 것을 나타냅니다 : 기다리지 마십시오.
async
메소드 외부에 나타나는 코드의 경우 메소드를 호출 할 수있는 유일한 [AutoAwait]
방법은 앞에 접두어를 붙이는 것입니다 start
. 이렇게하면 async
메소드에 표시되는지 여부에 관계없이 동일한 의미의 코드를 작성하게됩니다 .
욕심이 나기 시작합니다! :)
먼저 async
인터페이스 메소드에 적용 하고 싶습니다 .
interface IThing
{
async int GetCount();
}
그것은 기본적으로 구현 메소드가 Task<int>
또는 호환되는 것을 반환해야 await
하며 메소드를 호출하면 [AutoAwait]
동작 을 얻습니다 .
또한 위의 방법을 구현할 때 다음과 같이 쓸 수 있기를 원합니다.
async int GetCount()
따라서 Task<int>
반환 유형 으로 언급 할 필요가 없습니다 .
또한 async
대리자 유형 (결국 하나의 메서드가있는 인터페이스와 유사)에 적용하고 싶습니다. 그래서:
public async delegate TResult AsyncFunc<TResult>();
async
대표는이 - 당신은 그것을 짐작 - [AutoAwait]
행동. async
메소드 에서 호출 할 수 있으며 자동으로 await
선택됩니다 (단지 선택하지 않는 한 start
). 그리고 당신이 말하면 :
AsyncFunc<Document> getDoc = DownloadDocumentAsync;
그냥 작동합니다. 메소드 호출이 아닙니다. 아직 시작된 작업 async delegate
이 없습니다 - 작업이 아닙니다. 작업을 수행하는 공장입니다. 당신은 말할 수 있습니다 :
Document doc = getDoc();
그러면 작업이 시작되고 완료 될 때까지 기다렸다가 결과가 나타납니다. 또는 당신은 말할 수 있습니다 :
Task<Document> t = start getDoc();
따라서 "배관"이 누출되는 곳 중 한 곳은 async
메서드에 대리자를 만들려면 async delegate
형식 을 사용해야한다는 것 입니다. 따라서 대신 Func
에을 말해야합니다 AsyncFunc
. 언젠가는 그런 종류의 것이 개선 된 유형 유추에 의해 고정 될 수 있습니다.
또 다른 질문은 일반적인 (비동기 적 인) 방법으로 시작한다고 말하면 어떻게됩니까? 분명히 컴파일 오류가 안전한 옵션입니다. 그러나 다른 가능성이 있습니다.