我们有这样的方法:
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
? 如果没有,那么发生了什么? 它是如何实现的工作?
任务<>和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
可以解开其他类型的实现awaitable格局,但Task<T>
是你很可能最常使用的一个。)
这种双重包装/解包是允许异步如此组合的。 例如,我可以写它要求你的,结果双打另一异步方法:
public async Task<int> AccessTheWebAndDoubleAsync()
{
var task = AccessTheWebAsync();
int result = await task;
return result * 2;
}
(或者干脆return await AccessTheWebAsync() * 2;
当然)
无需要转换的任务为int。 使用时只需将任务结果。
int taskResult = AccessTheWebAndDouble().Result;
public async Task<int> AccessTheWebAndDouble()
{
int task = AccessTheWeb();
return task;
}
这将返回值(如果可用),否则返回0。