我们应该提供SmtpClient包装器的异步和同步实现吗?

时间:2014-06-18 12:21:55

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

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

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

由于SmtpClient实际上同时具有异步和同步实现,我们是否应该公开这两者,或者只是希望我们的ISmtpClient接口的任何消费者只需要Wait我们的异步SendAsync方法

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

2 个答案:

答案 0 :(得分:7)

如果您的消费者需要异步和同步版本,并且您可以提供那么不要强迫您的消费者同步异步,这会影响性能并最终导致死锁。

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


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

答案 1 :(得分:4)

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