【问题标题】:Wrap a synchronous method in Asynchronous call c#在异步调用c#中包装一个同步方法
【发布时间】:2015-12-14 20:32:09
【问题描述】:

我希望将同步方法包装到异步代码中,以便将这些方法公开为异步的 - 原因是我不想在同步方法中复制代码,因为我希望它是 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));
}

这是我的另一个问题,也许是对我的回答; 调用 Asynch 方法两次也会调用 sync 方法 - 因为它在 async 后面,所以我可以得到一个跨线程异常?对吗。

那么在这种情况下我应该怎么做 - 如何保持干燥并保持简单? 我可以将同步方法设为私有并强制对该方法的所有调用都是异步的 ..

如果你说我的示例代码是一个不好的方法,请给出一个简短的理由和一个简单的例子来说明一个好的方法......以及关于什么是最好的以及如何做到这一点的任何建议?

我看过这里 Is wrapping a synchronous call in a Task.Run() to make it asynchronous beneficial? 但这似乎并没有很清楚地回答,我想知道什么。

编辑

对于其他正在寻找的人 - 除了此处标记的答案之外,还有一些信息通过示例指向答案,更重要的是为什么。

Should I expose asynchronous wrappers for synchronous methods?

Which way is best for wrapping synchronous code into an asynchronous method?

【问题讨论】:

  • 只是我的两分钱:在网络托管中,处理申请的池线程是有限的资源,因此异步允许您在正常线程中运行代码(同步 AddValues),一旦完成其他池线程将处理申请的结束。优点是您有限的池线程对其他请求是免费的。你可以看看这里msdn.microsoft.com/en-us/magazine/dn802603.aspx
  • @Max Bundchen - 我没有在虚拟主机环境中运行。请看我的编辑。
  • "如果在调用同步方法的任何时候调用异步方法,我得到一个 oopse(面向对象的编程愚蠢错误)。"这是什么意思?
  • 确切的错误是什么?不要用“哎呀”之类的废话来浪费人们的时间。
  • 调用的时候为什么不同步使用,让调用者自己决定是否需要异步呢?没有理由仅仅因为您从异步方法调用它就使其异步,如果您是这样想的话。您可能需要提供真实的上下文才能使问题具有可回答性。

标签: c# multithreading design-patterns asynchronous synchronous


【解决方案1】:

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

正确的方法是"don't"

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

【讨论】:

  • 好的,你会怎么做,@Stephen Cleary 你会只创建异步方法,创建两个方法还是像 31eee384 所说的那样让方法保持同步并让调用者进行异步方法调用?
  • 返回此页面后@Stephen Cleary - 右侧显示相关链接。 stackoverflow.com/questions/31907427/… - 昨天我找不到任何我想做的事情。该链接是我需要知道的。你的回答也是我需要听到的。直截了当!
  • @Stix:如果您的方法只是同步代码,那么它应该只有一个同步 API,而不是异步 API。
【解决方案2】:

在 Stephen Cleary 的 cmets 之后,我找到了相关链接。What is the best way for wrapping synchronous code into asynchronous method

虽然措辞不准确 - 一条评论包含一个文章链接,该链接的措辞与我的问题的某一点完全一致。

Yuval Itzchakov 的评论包括了这一点。 “有一篇很棒的文章,名叫 Should I expose asynchronous wrappers for synchronous methods?,由 Stephan Toub 撰写,其中谈到了不做你想做的事情的所有原因。我建议阅读它。”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多