Как Task становится int?

У нас есть этот метод.

async Task AccessTheWebAsync() { HttpClient client = new HttpClient(); Task 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 return urlContents.Length; } 

Существует ли неявное преобразование между Task и int? Если нет, то что происходит, как оно реализовано для работы?

Существует ли неявное преобразование между Task <> и int?

Неа. Это просто часть работы async / await .

Любой метод, объявленный как async должен иметь тип возврата:

  • void (избегайте, если это возможно)
  • Task (без результата завершения / отказа)
  • Task (для логического результата типа T в асинхронном режиме)

Компилятор выполняет всю соответствующую упаковку. Дело в том, что вы асинхронно возвращаете urlContents.Length – вы не можете заставить метод просто возвращать int , поскольку фактический метод вернется, когда он достигнет первого await выражения, которое еще не выполнено. Таким образом, вместо этого он возвращает Task который будет завершен, когда сам метод async будет завершен.

Обратите внимание, что await делает обратное – оно разворачивает Task до значения T , как работает эта строка:

 string urlContents = await getStringTask; 

… но, конечно, он разворачивает его асинхронно, тогда как просто использование Result будет блокироваться до завершения задачи. ( await может развернуть другие типы, которые реализуют ожидаемый шаблон, но Task – это тот, который вы, скорее всего, будете использовать чаще всего.)

Эта двойная упаковка / разворачивание – это то, что позволяет async быть таким композиционным. Например, я мог бы написать еще один метод async, который вызывает ваш и удваивает результат:

 public async Task AccessTheWebAndDouble() { var task = AccessTheWeb(); int result = await task; return result * 2; } 

(Или просто return await AccessTheWeb() * 2; конечно.)

Нет требует преобразования задачи в int. Просто используйте результат задачи.

 int taskResult= AccessTheWebAndDouble.Result; public async Task AccessTheWebAndDouble() { int task = AccessTheWeb(); return task; } 

Он вернет значение, если доступно, иначе оно вернет 0.

  • Использование async-ожидания в .net 4
  • Является ли async / await подходящим для методов, которые связаны как с IO, так и с CPU?
  • Использование async / ожидание нескольких задач
  • Как создать asynchronous метод в C #?
  • Используют ли новые ключевые слова C # 5.0 «asynchronous» и «ожидающий» несколько ядер?
  • Использует ли использование async / wait новый stream?
  • Почему это асинхронное действие зависает?
  • async в консольном приложении на C #?
  • Пример async / wait, который вызывает тупик
  • Request.Content.ReadAsMultipartAsync никогда не возвращается
  • Возможно ли «ожидание возврата доходности DoSomethingAsync ()»
  • Давайте будем гением компьютера.