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方式的T
types的逻辑结果)
编译器做所有适当的包装。 重点是你asynchronous返回的urlContents.Length
– 你不能让方法返回int
,因为实际的方法将返回当它尚未完成的第一个await
expression式。 所以相反,它返回一个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。