为什么我的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指令或装配参考?)
正如其他人所指出的,您不能等待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的任何东西,他在我看来是这个话题上最好的作家之一)。