【问题标题】:Should we provide both asynchronous and synchronous implementations of SmtpClient wrapper?我们是否应该同时提供 SmtpClient 包装器的异步和同步实现?
【发布时间】:2014-07-07 05:41:34
【问题描述】:

根据this 文章,我们不应该提供异步实现的同步包装器。

我们在接口后面抽象了System.Net.SmtpClient,以便我们可以轻松测试发送电子邮件的代码。

由于SmtpClient 实际上同时具有异步和同步实现,我们应该同时公开这两个实现,还是只期望我们的ISmtpClient 接口的任何消费者只使用Wait 我们的异步SendAsync 方法。

在构建通用库时,不确定这里的指导方针是什么。在我们的例子中,我们知道我们需要同时使用异步和同步版本。

【问题讨论】:

  • 您始终可以通过扩展方法提供基于封装的 EAP/APM 任务的异步操作。然后在您的 api 文档中告诉用户他可以通过引用您的扩展 dll 来使用它们

标签: c# .net asynchronous task-parallel-library async-await


【解决方案1】:

如果您的消费者需要异步和同步版本并且您可以提供这些版本,那么您应该不要强迫您的消费者进行异步同步,这会损害性能并可能导致死锁。

您可以在 .Net 库中看到很多这样的示例,例如 SemaphoreSlim (Wait/WaitAsync) 或 TPL Dataflow (Post/SendAsync)。几乎总是当有一个异步选项时,也有一个同步选项。我能回忆起只有异步版本的唯一情况是在WinRT,但那是因为they are discouraging long sync calls


正如 Ned Stoyanov 提到的,Toub 的文章更多的是关于包装器,而不是真正的同步/异步操作。

【讨论】:

    【解决方案2】:

    我认为本文更多地讨论了当您的 API 仅提供 async 实现的情况,在这种情况下,客户端提供“同步异步”实现同样容易,因此您不会添加任何价值提供一个。我认为在同时提供两者的情况下,您应该同时公开两者。

    【讨论】:

      猜你喜欢
      • 2012-05-23
      • 2014-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多