이 방법이 있습니다.
async Task<int> AccessTheWebAsync()
{
HttpClient client = new HttpClient();
Task<string> getStringTask = client.GetStringAsync("http://msdn.microsoft.com");
// You can do work here that doesn't rely on the string from GetStringAsync.
DoIndependentWork();
string urlContents = await getStringTask;
//The thing is that this returns an int to a method that has a return type of Task<int>
return urlContents.Length;
}
Task<int>
와 사이에 암시 적 변환이 발생 int
합니까? 그렇지 않다면 무슨 일이 일어나고 있습니까? 작동하려면 어떻게 구현됩니까?
답변
Task <>와 int간에 암시 적 변환이 발생합니까?
아니. 이 방법의 한 부분입니다 async
/ await
작품.
async
has 선언 된 모든 메서드는 다음과 같은 반환 유형을 가져야합니다.
void
(가능하면 피하십시오)Task
(완료 / 실패 통지 이외의 결과 없음)Task<T>
(T
비동기 방식 의 논리적 결과 유형 )
컴파일러는 모든 적절한 래핑을 수행합니다. 요점은 비동기 적으로 반환 한다는 것입니다 . 실제 메서드가 아직 완료되지 않은 첫 번째 표현식에 도달 하면 반환되므로 메서드가 반환 urlContents.Length
되도록 만들 수 없습니다 . 따라서 대신 비동기 메서드 자체가 완료되면 완료되는를 반환합니다 .int
await
Task<int>
참고 await
반대하지는 – 그것은 펼쳤다 을 Task<T>
A와 T
이 라인이 어떻게 작동 값 :
string urlContents = await getStringTask;
… 물론 비동기식으로 래핑을 해제하지만 Result
작업이 완료 될 때 까지을 사용 하면 차단됩니다. ( await
awaitable 패턴을 구현하는 다른 유형을 풀 수 있지만 Task<T>
가장 자주 사용할 가능성이있는 유형입니다 .)
이 이중 래핑 / 언 래핑은 비동기를 구성 할 수있게합니다. 예를 들어, 사용자를 호출하고 결과를 두 배로 늘리는 다른 비동기 메서드를 작성할 수 있습니다.
public async Task<int> AccessTheWebAndDoubleAsync()
{
var task = AccessTheWebAsync();
int result = await task;
return result * 2;
}
(또는 단순히 return await AccessTheWebAsync() * 2;
물론입니다.)
답변
Task를 int로 변환 할 필요가 없습니다. 작업 결과를 사용하기 만하면됩니다.
int taskResult = AccessTheWebAndDouble().Result;
public async Task<int> AccessTheWebAndDouble()
{
int task = AccessTheWeb();
return task;
}
가능한 경우 값을 반환하고 그렇지 않으면 0을 반환합니다.