如何工作 成为一个int?(How does Task become an int?

2019-06-18 17:58发布

我们有这样的方法:

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 ? 如果没有,那么发生了什么? 它是如何实现的工作?

Answer 1:

任务<>和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;当然)



Answer 2:

无需要转换的任务为int。 使用时只需将任务结果。

int taskResult = AccessTheWebAndDouble().Result;

public async Task<int> AccessTheWebAndDouble()
{
    int task = AccessTheWeb();
    return task;
}

这将返回值(如果可用),否则返回0。



文章来源: How does Task become an int?