为什么我的异步方法会给我错误

时间:2016-11-18 17:24:18

标签: c#

    public static async Task<decimal> Add(string input1, string input2)
    {
        decimal number1 = Convert.ToDecimal(input1);
        decimal number2 = Convert.ToDecimal(input2);

        decimal sum = 0M;
        sum = await Add(number1, number2); //PROBLEM HERE

        return sum;
    }

    public static decimal Add(decimal number1, decimal number2)
    {
        return number1 + number2;
    }
}
  

严重级代码描述项目文件行抑制状态   错误CS1061&#39;十进制&#39;不包含&#39; GetAwaiter&#39;的定义   没有扩展方法&#39; GetAwaiter&#39;接受第一个论点   键入&#39;十进制&#39;可以找到(你是否错过了使用指令或   装配参考?)

注意:对于示例

的细化感到抱歉

1 个答案:

答案 0 :(得分:3)

正如其他人所指出的那样,您无法等待Add方法,因为它不会返回Task

public static Task<decimal> Add(decimal number1, decimal number2)
{
    // Async code goes here
    return number1 + number2;
}

我还想指出,如果你在Add方法中所做的只是return number1 + number2;,那么在这里使用await充其量是毫无意义的。第一名。添加不是一项昂贵的操作,因此您实际上会通过在后台线程上执行降低性能(因为与线程和async / await相关的开销)。

另外,正如@juharr指出的那样,async / await的主要用例是IO绑定操作,但事实并非如此。有两种方法可以使用async / await:

  • 在线程池中执行一些操作 - 这用于CPU绑定的任务。在这方面,从某种意义上说,至少任务并行库没有添加一个基本的“新”功能(线程池显然已经存在),它只是使它更方便使用。
  • async / await的主要应用是在同一个线程上进行异步操作。这用于IO绑定任务。这里的想法是,如果你所做的只是等待某些结果的结果(例如文件下载),那么调用线程在此期间不能做其他工作。虽然您可以在以前的某些情况下执行事件驱动的异步编程,但任务并行库使得这更加方便。

虽然你所拥有的是技术上一个CPU绑定操作,但你现在使用它的方式毫无意义,因为它根本不会提高性能 - 甚至一点也不提高。添加非常快,因为它可以很容易地在硬件中实现(并且大多数现代处理器都可以),并且在任何情况下你都没有做任何真正的并行性(即你只是等待结果,所以它不像你在计算加法的同时,在临时做任何其他工作。

我的回答here有一些额外的细节(加上Stephen Cleary的任何内容,我认为他是该主题的最佳作家之一。)