我有一个异步的api端点,然后我正在等待从数据库中获取。如果我想在获取类似计算的类型之后使用辅助方法,它是否必须是异步的(它不会调用任何数据库,除了使用已获取的数据并进行一些计算)
如果必须是异步,我该如何强迫事物变得异步呢? 喜欢这个?
await Task.Run(() => {
Calculate();
});
或者我只是让它同步。
var numbers = await repo.Numbers.ToListAsync();
Calculate(numbers);
答案 0 :(得分:4)
如果它不进行文件或数据库I / O或其他可能阻塞的操作,请保持同步。
以这种方式思考:如果你问的是真的,那么整个.NET API都是异步的,你提出的Calculate
例子与Int32.TryParse
之类的例子之间没有区别。任何其他随机API调用。
答案 1 :(得分:0)
您在示例中所做的事情并不理想。
如果您的基础调用(在这种情况下计算)是同步的,并且您的API中没有其他异步操作调用,那么将您的API标记为"异步& #34;,除非你必须满足合同。
另一方面,数据检索实际上是一个IO操作,它应该是异步的。而不是将IO逻辑包装在同步"计算"方法,我建议将其更新为异步(您可以遵循惯例并将其命名为 CalculateAsync 然后)。这将允许您消除Task.Run调用,因为它是不必要的。
为了概括这一点,如果API使用异步逻辑,则API应该是异步的。否则 - 它应该是同步的。