根据this文章,我们不应该提供异步实现的同步包装。我们是否应该提供SmtpClient包装器的异步和同步实现?
我们在接口后面提取了System.Net.SmtpClient
,以便我们可以轻松测试发送电子邮件的代码。
由于SmtpClient
实际上有异步和同步实现,我们应该揭露这两种或只是希望我们的ISmtpClient
接口的任何消费只是Wait
我们的异步SendAsync
方法。
不知道在构建通用库时,这些指南是什么。在我们的案例中,我们知道我们需要使用异步和同步版本。
根据this文章,我们不应该提供异步实现的同步包装。我们是否应该提供SmtpClient包装器的异步和同步实现?
我们在接口后面提取了System.Net.SmtpClient
,以便我们可以轻松测试发送电子邮件的代码。
由于SmtpClient
实际上有异步和同步实现,我们应该揭露这两种或只是希望我们的ISmtpClient
接口的任何消费只是Wait
我们的异步SendAsync
方法。
不知道在构建通用库时,这些指南是什么。在我们的案例中,我们知道我们需要使用异步和同步版本。
如果您的消费者需要异步和同步版本,并且您可以提供那些,那么您应该使用。 不要强制您的消费者做同步通过异步,它会损害性能,并可能导致死锁。
你可以看到许多这样的例子在.Net
库,例如SemaphoreSlim
(Wait/WaitAsync
)或TPL Dataflow
(Post/SendAsync
)。几乎总是有一个异步选项时,还有一个同步选项。我可以回忆的唯一情况是只有一个异步版本在WinRT
,但那是因为they are discouraging long sync calls。
正如Ned Stoyanov所说,Toub的文章更多的是关于包装器,而不是真正的同步/异步操作。
我认为当您的API仅提供async
实现时,本文将更多地讨论这种情况,在这种情况下,客户端提供“异步同步”实现同样容易,因此您没有增加任何价值一。我认为在两种情况都提供的情况下,你应该暴露两者。
您可以随时通过扩展方法提供基于EAP/APM任务的异步操作。然后在你的api文档中告诉用户,他可以选择通过引用你的扩展DLL来使用它们 –