[c#] Task <int>는 어떻게 int가 되나요?

이 방법이 있습니다.

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작품.

asynchas 선언 된 모든 메서드는 다음과 같은 반환 유형을 가져야합니다.

  • void (가능하면 피하십시오)
  • Task (완료 / 실패 통지 이외의 결과 없음)
  • Task<T>( T비동기 방식 의 논리적 결과 유형 )

컴파일러는 모든 적절한 래핑을 수행합니다. 요점은 비동기 적으로 반환 한다는 것입니다 . 실제 메서드가 아직 완료되지 않은 첫 번째 표현식에 도달 하면 반환되므로 메서드가 반환 urlContents.Length되도록 만들 수 없습니다 . 따라서 대신 비동기 메서드 자체가 완료되면 완료되는를 반환합니다 .intawaitTask<int>

참고 await반대하지는 – 그것은 펼쳤다Task<T>A와 T이 라인이 어떻게 작동 값 :

string urlContents = await getStringTask;

… 물론 비동기식으로 래핑을 해제하지만 Result작업이 완료 될 때 까지을 사용 하면 차단됩니다. ( awaitawaitable 패턴을 구현하는 다른 유형을 풀 수 있지만 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을 반환합니다.


답변