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

时间:2015-09-17 20:24:21

标签: c# multithreading design-patterns asynchronous synchronous

我希望将同步方法包装成异步代码,以便将这些方法公开为异步 - 原因是我不想在同步方法中复制代码,因为我希望它是DRY并且已经知道了这些功能syunchronous代码的工作原理 - 不需要管理单独的方法。但是我想要异步方法。我理解异步方法的目的,至少他们做了什么以及为什么我想要使用它们。

请考虑以下代码:

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方法 - 因为它在异步后面,我可以得到一个跨线程异常?这是正确的。

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

如果你说我的示例代码是一种不好的方法,请提供一个简短的原因和一个简单的例子来做一个好的方法..以及关于什么是最好的以及如何做的任何建议?< / p>

我看过这里 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?

2 个答案:

答案 0 :(得分:3)

  

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

正确的方法是"don't"

更重要的是,你的API不应该谎言。如果他们正在进行同步工作,他们应该有同步签名。

答案 1 :(得分:0)

经过Stephen Cleary的评论后,我找到了相关的链接.. What is the best way for wrapping synchronous code into asynchronous method

虽然没有完全措辞 - 但有一条评论包含一篇文章链接,该文章完全针对我的问题的一个方面。

Yuval Itzchakov的评论包含了这一点。 &#34; Stephan Toub撰写了一篇名为Should I expose asynchronous wrappers for synchronous methods?的文章,讲述了不做你想做的事情的所有理由。我建议阅读它。&#34;