c# - Task<int> 是如何变成一个 int 的?

标签 c# .net asynchronous .net-4.5 c#-5.0

我们有这个方法:

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/

相关文章:

.net - 面向 .NET Framework 4.5.1 而不是 4.5 有什么好处?

javascript - 使用 Node.js 同步写入时出错

node.js - 从大型 MongoDB 集合动态生成 Mocha 测试

c# - 如何在IdentityServer4/Identity中配置角色声明名称

c# - 一次性在多个表中添加数据,并在它们之间设置外键约束

.net - xsl :template match doesn't find matches

javascript - 获取 Dynamics NAV 中文件的文件夹路径,而不使用 FileManagement.OpenFolderDialog

python - `Pool.*_async` 功能从未准备好

c# - Linq 计数,问题

c# - 使用 AsyncFileUpload 控件裁剪图像的代码