【发布时间】: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