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

Ben*_*ter 2 .net c# asynchronous task-parallel-library async-await

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

我们已经抽象了System.Net.SmtpClient一个接口,以便我们可以轻松测试发送电子邮件的代码.

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

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

i3a*_*non 7

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

你可以在.NetSemaphoreSlim(Wait/WaitAsync)或TPL Dataflow(Post/SendAsync)这样的库中看到很多这样的例子.几乎总是当有异步选项时,还有一个同步选项.唯一可以回忆起只存在异步版本的情况WinRT,但那是因为它们阻止了长时间的同步调用.


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