在c#异步调用中包装一个同步方法

本文关键字:一个 同步方法 包装 异步 调用 | 更新日期: 2023-09-27 18:13:16

我希望将同步方法包装到异步代码中,以便将这些方法暴露为异步-原因是我不想复制同步方法中的代码,因为我希望它是DRY的,并且已经知道同步代码的功能工作-也不需要管理单独的方法。然而,我更喜欢异步方法。我了解异步方法的目的,至少了解它们做了什么,以及为什么我想使用它们。

考虑以下代码:

public int AddValues(int a, int b)
{
  // some really boring or extremely long DRY method code 
  return a + b;
}

添加如下所示的异步调用方法节省编写代码的时间;确保内部代码的功能与同步代码相同。我可以或应该这样做吗?:

public async task AddValuesAsync(int a, int b)
{
  return await Task.FromResult(AddValues(a,b));
}

这是我的另一个问题,也许是我的答案;调用异步方法两次也将调用同步方法-因为它是异步的背后,我可以得到一个跨线程异常?

那么在这种情况下我应该怎么做——如何保持DRY和简单?我可以将sync方法设为私有,并强制对该方法的所有调用为Async .

如果你说我的示例代码是一种不好的方法,请给出一个简短的原因和一个简单的好方法的例子。有什么建议是最好的,怎么做呢?

我在这里找过了在Task.Run()中包装同步调用以使其异步有益吗?但这似乎没有很清楚地回答我想知道的问题。

编辑

对于那些正在寻找答案的人-除了这里标记的答案之外,还有一些信息指出了答案的例子,更重要的是为什么。

应该为同步方法公开异步包装器吗?

将同步代码包装成异步方法的最佳方式是什么?

在c#异步调用中包装一个同步方法

我问这个问题是因为我想知道什么是正确的方法是使同步方法在类中具有异步版本并且尽可能DRY。

正确的做法是"不要"。

更重要的是,你的API不应该包含。如果他们在做同步工作,他们应该有一个同步签名。

在Stephen Cleary的评论之后,我找到了一个相关的链接。将同步代码包装到异步方法

中的最佳方法是什么?

虽然措辞不准确,但有一条评论包含了一个文章链接,该链接的措辞正好符合我的问题的一点。

Yuval Itzchakov的评论包含了这个。"有一篇很棒的文章叫做我应该为同步方法公开异步包装器吗?Stephan Toub的书,书中讨论了不去做你想做的事情的所有理由。我建议你读一读。"