2014-06-18 60 views
2

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

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

由于SmtpClient实际上有异步和同步实现,我们应该揭露这两种或只是希望我们的ISmtpClient接口的任何消费只是Wait我们的异步SendAsync方法。

不知道在构建通用库时,这些指南是什么。在我们的案例中,我们知道我们需要使用异步和同步版本。

+0

您可以随时通过扩展方法提供基于EAP/APM任务的异步操作。然后在你的api文档中告诉用户,他可以选择通过引用你的扩展DLL来使用它们 –

回答

7

如果您的消费者需要异步和同步版本,并且您可以提供那些,那么您应该使用不要强制您的消费者做同步通过异步,它会损害性能,并可能导致死锁。

你可以看到许多这样的例子在.Net库,例如SemaphoreSlimWait/WaitAsync)或TPL DataflowPost/SendAsync)。几乎总是有一个异步选项时,还有一个同步选项。我可以回忆的唯一情况是只有一个异步版本在WinRT,但那是因为they are discouraging long sync calls


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

4

我认为当您的API仅提供async实现时,本文将更多地讨论这种情况,在这种情况下,客户端提供“异步同步”实现同样容易,因此您没有增加任何价值一。我认为在两种情况都提供的情况下,你应该暴露两者。

相关问题