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

时间:2015-05-26 12:39:24

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

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

编辑:

对于那些问“为什么这个方法是异步的?”的人 - 因为我试图构建一个小而简单的代码示例来演示这个问题。我本来应该添加一个调用代码的例子,但我试图保持代码尽可能小而简单。

3 个答案:

答案 0 :(得分:4)

  

我假设这里涉及一些语法糖

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

  

如果我不使用async关键字,我会收到有关不存在的投诉   能够将一个布尔值转换为Task<bool>

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

我认为没有理由将此方法标记为async

答案 1 :(得分:2)

  

似乎async关键字导致任务运行,然后返回值是任务的结果

正确。

此方法中没有任何内容可以从async中受益。但是:

  

如果我不使用async关键字,我会收到有关无法将bool投放到Task<bool>

的投诉

调用者会发生这种情况。在没有看到该代码的情况下,人们通常只能评论您可以:

  • 将来电者更改为不会认为已获得等待回报。
  • 更改功能以返回bool,但在来电者上使用Task.FromResult(IsNumberOdd(value))

答案 2 :(得分:0)

不是关于异步的。关于任务。

你返回一个bool,你的函数的返回值是Task

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

无法编译。 如果你没有做任何异步的事情,你就不应该返回任务。

如果你需要异步运行某些东西,我希望这里有一些选项可以使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
    }

}
相关问题