根据this文章,我们不应该提供异步实现的同步包装。
我们已经在界面后面抽象System.Net.SmtpClient
,以便我们可以轻松测试发送电子邮件的代码。
由于SmtpClient
实际上同时具有异步和同步实现,我们是否应该公开这两者,或者只是希望我们的ISmtpClient
接口的任何消费者只需要Wait
我们的异步SendAsync
方法
在构建通用库时,不确定这里的准则是什么。在我们的例子中,我们知道我们需要同时使用异步和同步版本。
答案 0 :(得分:7)
如果您的消费者需要异步和同步版本,并且您可以提供那么。 不要强迫您的消费者同步异步,这会影响性能并最终导致死锁。
您可以在.Net
库(例如SemaphoreSlim
(Wait/WaitAsync
)或TPL Dataflow
(Post/SendAsync
)中看到许多相关示例。几乎总是在有异步选项时,还有一个同步选项。唯一可以回忆一下WinRT
中只有异步版本的情况,但那是因为they are discouraging long sync calls。
正如Ned Stoyanov所说,Toub的文章更多地是关于包装器,而不是真正的同步/异步操作。
答案 1 :(得分:4)
我认为文章更多地讨论了当您的API仅提供async
实现时的情况,在这种情况下,客户端提供“异步同步”实现同样容易,因此没有添加任何值由你提供一个。我认为在两者都提供的情况下你应该暴露两者。