c# - 为什么我需要使此方法异步?

标签 c# asynchronous async-await task-parallel-library

<分区>

我有与此非常相似的代码(我稍微简化了代码以展示我试图弄清楚的行为的本质)。

public async System.Threading.Tasks.Task<bool> IsNumberOdd(int numToTest)
{
    if (numToTest % 2 == 0)
    {
        return false;
    }
    else
    {
        return true;
    }
}

如果我离开 async关键字,我收到关于无法转换 bool 的投诉到 Task<bool> .我假设这里涉及一些语法糖。查看 IL(我对 IL 不是很熟悉)似乎是 async 关键字导致任务运行,然后返回值是任务的结果。我的理解正确吗?

顺便说一句,如果这是一个骗局,或者如果有一些博客帖子讨论了这个,请随时指出我并关闭它。我不是想掩盖我的代表;我试图了解这段代码发生了什么。

编辑:


对于所有问“为什么这个方法是异步的?”的人——因为我试图构建一个小而简单的代码示例来演示这个问题。我还应该添加一个调用代码示例,但我试图让代码尽可能小和简单。

最佳答案

I'm assuming there's some syntactic sugar involved here

不完全是“语法糖”。编译器正在生成一个状态机,因为该方法被标记为 async .这就是为什么您可以返回 Task<bool> 的原因无需显式创建 Task为返回值。

If I leave off the async keyword, I get a complaint about not being able to cast a bool to a Task<bool>.

async修饰符触发编译器创建状态机。如果删除它,则需要创建 Task你自己。如果出于任何原因你想创建一个 Task<T>但你实际上是在同步运行, Task.FromResult 是你的 friend 。

我看不出为什么这个方法被标记为 async .

关于c# - 为什么我需要使此方法异步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30458846/

相关文章:

c# - 从 C# 发送 Mandrill 电子邮件

ios - 从 Swift 函数中的异步调用返回数据

c# - 如何处理 TPL 中的任务取消

c# - 我的桌面应用程序在使用 async 和 await 调用 Web API 服务时挂起

c# - "DataBinding: ' index+NewsItem ' does not contain a property with the name ' 链接 '",但属性存在(不是错字)

c# - 使用 Json.NET 序列化后的程序集卸载

Javascript 参数作为未定义传递

asynchronous - Rust 异步程序中的性能和内存问题

c# - “无法等待任务 <string>”(PCL Xamarin Studio)

c# - "Invalid provider type specified"尝试加载证书私钥时出现CryptographicException