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 回答
正如其他人所指出的那样,你不能等待
Add
方法,因为它不会返回Task
.我在
Add
方法中做的事情是return number1 + number2;
然后在这里首先使用await
是没有意义的 . 添加不是一项昂贵的操作,因此您实际上会通过在后台线程上执行它来降低性能(因为与线程和async / await相关的开销) .另外,正如@juharr所指出的,async / await的主要用例是IO绑定操作,但事实并非如此 . 有两种方法可以使用async / await:
在线程池中执行一些操作 - 这用于CPU绑定任务 . 在这方面,从某种意义上说,至少任务并行库没有添加一个基本的功能(线程池显然已经存在),它只是使它更方便使用 .
async / await的主要应用程序是在同一个线程上执行异步操作 . 这用于IO绑定任务 . 这里的想法是,如果所有你没有理由调用线程在此期间不能做其他工作 . 虽然您可以在以前的某些情况下执行事件驱动的异步编程,但是任务并行库使得这更加方便 .
虽然你所拥有的只是技术上的CPU操作,但你根本不能提高性能 - 甚至不是一点点 . 添加非常快,因为它可以很容易地在硬件中实现(并且大多数现代处理器都可以实现),并且你只是等待结果,所以它在正在计算加法的过程中进行任何其他工作 .
我的回答here有一些额外的细节(加上Stephen Cleary的任何内容,在我看来,谁是这个话题最好的作家之一) .