【发布时间】:2013-02-14 08:17:40
【问题描述】:
我面临着设计执行网络 I/O 的方法(对于可重用库)的问题。我读过这个问题
c# 5 await/async pattern in API design
还有其他更接近我的问题。
所以,问题是,如果我想同时提供 异步和非异步 方法,我该如何设计这些方法?
例如,要公开方法的非异步版本,我需要做类似的事情
public void DoSomething() {
DoSomethingAsync(CancellationToken.None).Wait();
}
我觉得这不是一个伟大的设计。我想要一个建议(例如)关于如何定义可以包装在公共方法中以提供两个版本的私有方法。
【问题讨论】:
-
重要问题:
DoSomethingAsync的异步部分是如何实现的?这很重要,因为如果这是创建Task和工作线程,那么答案可能与使用外部事件 API 的情况大不相同。具体来说,如果“async”方法正在占用一个线程,那么让“sync”方法调用“async”方法和“wait”是没有意义的:最好直接完成工作。但是,这对于“异步”的其他含义有所改变(并非所有“异步”都表示“线程”) -
@MarcGravell,我试图解释得更好(这并不简单,因为英语不是我的主要语言)。我有执行密集 I/O 的“操作 XYZ”。我想用两种方法在库中公开它:一种使用异步模式几乎立即返回(如 MS Task-based Asynchronous Pattern doc 中所述),另一种执行同步。什么是更高效 / 可维护 / 启用单元测试的方法。使用公共异步包装器和另一个同步包装器公开的私有方法,例如?如果是,这些方法是怎样的?
-
“高效”和“可维护”不是一回事,而且经常相互矛盾。再说一遍:这完全取决于您的“异步”代码当前的工作方式。如果那是您只是在单独的线程上运行的程序/线性代码,那么坦率地说,通过“异步”公开它是没有意义的。如果该代码是完全异步的,那么如果您希望“高效”作为目标,那么最好有 2 个完全独立的实现。抱歉,这个问题非常是特定于上下文的,你没有给出太多上下文。
-
@MarcGravell,是的,老实说,高效+可维护这一对是一种天真的挑衅,它可以刺激和扩展对话,而不会以偏离主题的评论结束(我希望如此)。我很难回答你关于如何实现
DoSomethingAsync的问题,因为我实际上只有一个同步存根,我愿意从头开始重写所有内容。我怀疑这完全取决于具体操作的复杂性,不幸的是每个案例都必须单独评估,并且没有共同的模式可以依赖。 -
因燃烧我的大脑而被投票
标签: c# asynchronous