我们有这个方法:
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
?如果不是,那么发生了什么?它是如何实现的?
最佳答案
Does an implicit conversion occur between Task<> and int?
没有。这只是 async
的一部分/await
有效。
声明为 async
的任何方法必须有一个返回类型:
-
void
(尽可能避免) -
Task
(除完成/失败通知外没有结果) -
Task<T>
(对于T
类型的逻辑结果以异步方式)
编译器会进行所有适当的包装。重点是您异步返回urlContents.Length
- 你不能让方法只返回 int
, 因为实际的方法会在遇到第一个 await
时返回尚未完成的表达式。因此,它返回一个 Task<int>
这将在异步方法本身完成时完成。
请注意 await
相反 - 它展开一个Task<T>
到 T
值,这就是这条线的工作原理:
string urlContents = await getStringTask;
... 但当然它会异步解包,而只使用 Result
将阻塞直到任务完成。 (await
可以解包实现可等待模式的其他类型,但 Task<T>
是您可能最常使用的类型。)
正是这种双重包装/解包让异步变得如此可组合。例如,我可以编写另一个异步方法来调用您的方法并将结果加倍:
public async Task<int> AccessTheWebAndDoubleAsync()
{
var task = AccessTheWebAsync();
int result = await task;
return result * 2;
}
(或者当然是 return await AccessTheWebAsync() * 2;
。)
关于c# - Task<int> 是如何变成一个 int 的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13159080/