首页 文章

为什么我的异步方法给我错误[关闭]

提问于
浏览
-4
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“十进制”不包含“GetAwaiter”的定义,并且没有扩展方法“GetAwaiter”接受第一个类型为“decimal”的参数(您是否缺少using指令或装配参考?)

注意:很抱歉该示例的实用性

1 回答

  • 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的任何内容,在我看来,谁是这个话题最好的作家之一) .

相关问题