为什么我的async方法给我错误

本文关键字:错误 方法 我的 async 为什么 | 更新日期: 2023-09-27 18:18:34

    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 'decimal'不包含'GetAwaiter'的定义并且没有扩展方法'GetAwaiter'接受的第一个参数可以找到'decimal'类型(您是否缺少using指令或装配参考?)

为什么我的async方法给我错误

正如其他人所指出的,您不能等待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约束的操作,但你现在使用它的方式是毫无意义的,因为它根本不会提高性能——甚至一点也不会。加法非常快,因为它可以很容易地在硬件中实现(大多数现代处理器都这样做),并且在任何情况下你都没有做任何真正的并行(即你只是在等待结果,所以在计算加法的过程中,你不会做任何其他工作)。

我的回答有一些额外的细节(加上Stephen Cleary的任何东西,他在我看来是这个话题上最好的作家之一)。