C# 异步函数中的普通方法也应该是异步的吗?

C# 异步函数中的普通方法也应该是异步的吗?,c#,.net,asynchronous,.net-core,C#,.net,Asynchronous,.net Core,我有一个异步的api端点,然后等待从数据库获取。如果我想在像calculate something这样的获取完成后使用helper方法,它是否也必须是异步的(除了使用获取的数据并进行一些计算之外,它不调用任何数据库) 如果它必须是异步的,那么我如何强制事情是异步的呢? 像这样 await Task.Run(() => { Calculate(); }); 还是让它保持同步 var numbers = await repo.Numbers.ToListAsyn

我有一个异步的api端点,然后等待从数据库获取。如果我想在像calculate something这样的获取完成后使用helper方法,它是否也必须是异步的(除了使用获取的数据并进行一些计算之外,它不调用任何数据库)

如果它必须是异步的,那么我如何强制事情是异步的呢? 像这样

    await Task.Run(() => {
       Calculate();
    });
还是让它保持同步

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

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


这样想:如果你问的是真的,那么整个.NET API都是异步的,你提出的
Calculate
示例和类似
Int32.TryParse
或任何其他随机API调用之间没有区别。

如果它没有执行文件或数据库I/O,就让它保持同步,或其他潜在的阻塞操作


这样想:如果你问的是真的,那么整个.NET API都是异步的,你建议的
Calculate
示例和类似
Int32.TryParse
或任何其他随机API调用之间没有区别。

你在示例中所做的并不理想

如果您的基础调用(在本例中为Calculate)是同步的,并且API中没有其他异步操作调用,那么将API标记为“异步”是没有意义的,除非您必须满足约定

但另一方面,数据检索实际上是一个IO操作,应该是异步的。我建议将IO逻辑更新为异步,而不是将其包装在同步“计算”方法中(您可以按照约定将其命名为CalculateAsync)。这将允许您消除该任务。运行call,因为这是不必要的


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

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

如果您的基础调用(在本例中为Calculate)是同步的,并且API中没有其他异步操作调用,那么将API标记为“异步”是没有意义的,除非您必须满足约定

但另一方面,数据检索实际上是一个IO操作,应该是异步的。我建议将IO逻辑更新为异步,而不是将其包装在同步“计算”方法中(您可以按照约定将其命名为CalculateAsync)。这将允许您消除该任务。运行call,因为这是不必要的


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

这是正常的,应该在异步区域内使用同步代码;在即将到来的“pipelines”IO API中,一些新事物实际上需要它,因为框架是异步的,但许多关键原语是
ref-struct
,因此只能从同步代码中使用。这将与您的示例一样正常,并且希望在异步区域内使用同步代码;在即将到来的“pipelines”IO API中,一些新事物实际上需要它,因为框架是异步的,但许多关键原语是
ref-struct
,因此只能从同步代码中使用。这就像你的例子一样