Fre*_*man 101 .net c# asynchronous c#-5.0 .net-4.5
我们有这个方法:
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;
}
Run Code Online (Sandbox Code Playgroud)
之间是否隐式转换发生Task<int>
和int
?如果没有,那么发生了什么?它是如何实现的?
Jon*_*eet 151
在Task <>和int之间是否发生了隐式转换?
不.这只是如何async
/ await
工作的一部分.
声明为的任何方法async
必须具有以下返回类型:
void
(尽可能避免)Task
(除完成/失败通知外没有结果)Task<T>
(对于T
异步方式的类型的逻辑结果)编译器执行所有适当的包装.关键是你异步返回urlContents.Length
- 你不能让方法返回int
,因为实际的方法将在它到达第一个await
尚未完成的表达式时返回.因此,它返回一个Task<int>
在异步方法本身完成时将完成的.
请注意,await
则正好相反-它解开一Task<T>
到一个T
值,这是此行是如何工作的:
string urlContents = await getStringTask;
Run Code Online (Sandbox Code Playgroud)
...但当然它是异步打开它,而只是使用Result
会阻塞,直到任务完成.(await
可以解开实现等待模式的其他类型,但是Task<T>
最常用的是.)
这种双重包装/解包是允许异步可组合的原因.例如,我可以编写另一个异步方法来调用你的结果并将结果加倍:
public async Task<int> AccessTheWebAndDoubleAsync()
{
var task = AccessTheWebAsync();
int result = await task;
return result * 2;
}
Run Code Online (Sandbox Code Playgroud)
(或者return await AccessTheWebAsync() * 2;
当然.)
Ani*_*rma 13
不需要将Task转换为int.只需使用任务结果.
int taskResult = AccessTheWebAndDouble().Result;
public async Task<int> AccessTheWebAndDouble()
{
int task = AccessTheWeb();
return task;
}
Run Code Online (Sandbox Code Playgroud)
如果可用,它将返回值,否则返回0.