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之间是否发生隐式转换? 如果没有,那么发生了什么事,它是如何实施的?

在Task <>和int之间是否发生隐式转换?

不。 这只是async / await工作的一部分。

声明为async任何方法必须具有以下返回types:

  • void (如果可能,避免)
  • Task (没有超出完成/失败通知的结果)
  • Task<T> (对于asynchronous方式的Ttypes的逻辑结果)

编译器做所有适当的包装。 重点是你asynchronous返回的urlContents.Length – 你不能让方法返回int ,因为实际的方法将返回当它尚未完成的第一个awaitexpression式。 所以相反,它返回一个Task<int> ,当asynchronous方法完成时它将完成。

请注意, await做相反的事情 – 它将Task<T> 解开T值,这就是这条线的工作原理:

 string urlContents = await getStringTask; 

…但是当然它会asynchronous解包,而使用Result会阻塞,直到任务完成。 ( await可以解开其他types的实现等待模式,但Task<T>是你可能经常使用的)。

这种双重包装/解包是允许asynchronous如此组合的。 例如,我可以编写另一个调用你的asynchronous方法,并将结果加倍:

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

(或者干脆return await AccessTheWeb() * 2;当然。)

不需要将任务转换为int。 简单地使用任务结果。

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

它会返回值,如果可用,否则返回0。