异步函数内部的常规方法是否也应该是异步的?

时间:2018-01-21 20:24:49

标签: c# .net asynchronous .net-core

我有一个异步的api端点,然后我正在等待从数据库中获取。如果我想在获取类似计算的类型之后使用辅助方法,它是否必须是异步的(它不会调用任何数据库,除了使用已获取的数据并进行一些计算)

如果必须是异步,我该如何强迫事物变得异步呢? 喜欢这个?

    await Task.Run(() => {
       Calculate();
    });

或者我只是让它同步。

var numbers = await repo.Numbers.ToListAsync();
Calculate(numbers);

2 个答案:

答案 0 :(得分:4)

如果它不进行文件或数据库I / O或其他可能阻塞的操作,请保持同步。

以这种方式思考:如果你问的是真的,那么整个.NET API都是异步的,你提出的Calculate例子与Int32.TryParse之类的例子之间没有区别。任何其他随机API调用。

答案 1 :(得分:0)

您在示例中所做的事情并不理想。

如果您的基础调用(在这种情况下计算)是同步的,并且您的API中没有其他异步操作调用,那么将您的API标记为"异步& #34;,除非你必须满足合同。

另一方面,数据检索实际上是一个IO操作,它应该是异步的。而不是将IO逻辑包装在同步"计算"方法,我建议将其更新为异步(您可以遵循惯例并将其命名为 CalculateAsync 然后)。这将允许您消除Task.Run调用,因为它是不必要的。

为了概括这一点,如果API使用异步逻辑,则API应该是异步的。否则 - 它应该是同步的。