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

Why Do I Need To Make This Method Async?

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

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 关键字导致任务为 运行,然后 return 值是任务的结果。我理解正确吗?

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

编辑:


对于所有提问的人 "why is this method async?"-- 因为我试图构建一个小而简单的代码示例来演示这个问题。我还应该添加一个调用代码示例,但我试图让代码尽可能小和简单。

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

不完全是 "syntactic sugar"。编译器正在生成 状态机 ,因为该方法被标记为 async。这就是为什么您可以 return 一个 Task<bool> 而无需为 return 值显式创建 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 是你的朋友。

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

这与异步无关。关于任务。

你的 returning 一个 bool 和你的函数的 return 值是 Task

     public Task<bool> DoSomething()
     { 
         return false;
     }

无法编译。 如果你不做任何异步的事情,你不应该 return 任务。

如果您需要 运行 一些异步操作,这里有一些选项,我希望它们可以使 async/await 的用法更加清晰。

public class Sample
{
    public async void RunSample() 
    {
        // return a task. later obtain a result if some fashion 
        Task<bool> task = DoSomethingAsync();
        bool res1 = task.Result;

        // await a task which is created for you by re-wrapping the result.
        bool res2 = await AwaitSomethingAsync();

        // await a task which is created for you by rewrapping the result due to await.
        bool res3 = await DoSomethingAsync2();

        // await a task.
        bool res4 = await DoSomethingAsync();     
    }


    public async Task<bool> DoSomethingAsync2()
    {
        return false;
    }

    public Task<bool> DoSomethingAsync()
    {
        return Task<bool>.Run(() => { return false; });
    }

    public async Task<bool> AwaitSomethingAsync()
    {
        bool res = await Task<bool>.Run(() => { return false; });
        return res; // re-wraps it in a Task
    }

}

it seems as if the async keyword is causing the task to be run and then the return value is the result of the task

正确。

此方法中没有任何东西可以从 async 中获益。然而:

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

会在来电者身上发生。如果没有看到该代码,您只能一般性地评论您可以:

  • 将调用者更改为不假设它正在等待 return。
  • 将函数更改为 return bool,但在调用者上使用 Task.FromResult(IsNumberOdd(value)).