编写设计良好的异步/非异步API

jay*_*jay 52 c# asynchronous

我正面临着设计执行网络I/O(对于可重用库)的方法的问题.我读过这个问题

c#5等待API设计中的/ async模式

以及更接近我的问题的其他人.

所以,问题是,如果我想提供异步和非异步方法我将如何设计这些?

例如,为了公开方法的非异步版本,我需要做类似的事情

public void DoSomething() {
  DoSomethingAsync(CancellationToken.None).Wait();
}
Run Code Online (Sandbox Code Playgroud)

我觉得这不是一个很棒的设计.我想建议(例如)如何定义可以包含在公共方法中的私有方法以提供两个版本.

Ste*_*ary 62

如果您需要最易维护的选项,则只提供一个asyncAPI,该API在不进行任何阻塞调用或使用任何线程池线程的情况下实现.

如果您确实想要同时使用asyncAPI和同步API,那么您将遇到可维护性问题.你真的需要实现它两次:一次async和一次同步.这两种方法看起来几乎完全相同,因此初始实现很容易,但最终会得到两个几乎完全相同的方法,因此维护是有问题的.

特别是,没有一种简单的方法来制作一个async或同步的"包装器".Stephen Toub有关于这个主题的最佳信息:

  1. 我应该为同步方法公开异步包装器吗?
  2. 我应该为异步方法公开同步包装器吗?

(这两个问题的简答都是"不")

  • {+1}这是我需要听到的东西!与此同时,我最终重写了真正异步的方法,而不再关心同步版本了.毕竟消费者可以从他们的代码**调用DoSomethingAsync.Wait()**,如果他们想要这样做的话.我关注Mono兼容性,但是profile 3.0支持`async` /`await`关键字,所以问题不存在.顺便说一句,很棒的文章. (2认同)
  • @jay我会超过+1; 我现在和Stephen Toub坐在一起,这个答案是一个非常复杂的问题的理想答案.所以我要用+500全力以赴. (2认同)