Должны ли мы предоставлять как асинхронные, так и синхронные реализации SmtpClient wrapper?

#c# #.net #asynchronous #task-parallel-library #async-await

#c# #.net #асинхронный #задача-параллельная-библиотека #асинхронное ожидание

Вопрос:

Согласно этой статье, мы не должны предоставлять синхронные оболочки асинхронных реализаций.

Мы абстрагировали интерфейс System.Net.SmtpClient behind an, чтобы мы могли легко тестировать код, который отправляет электронные письма.

Поскольку SmtpClient на самом деле имеет как асинхронную, так и синхронную реализации, должны ли мы предоставлять обе из них или просто ожидать, что любой потребитель нашего ISmtpClient интерфейса будет использовать только Wait наш асинхронный SendAsync метод.

Не уверен, какие здесь рекомендации, когда дело доходит до создания библиотеки общего назначения. В нашем случае мы знаем, что нам нужно использовать как асинхронные, так и синхронизированные версии.

Комментарии:

1. Вы всегда можете предоставить асинхронную операцию на основе задач EAP / APM с помощью методов расширения. Затем в вашей документации по api сообщите пользователю, что у него есть возможность использовать их, ссылаясь на ваше расширение dll

Ответ №1:

Если вашим потребителям нужны как асинхронные, так и синхронные версии, и вы можете их предоставить, тогда вам следует. Не заставляйте своих потребителей выполнять синхронизацию через асинхронность, это снижает производительность и может привести к тупикам.

Вы можете увидеть много примеров этого в .Net библиотеках, таких как SemaphoreSlim ( Wait/WaitAsync ) или TPL Dataflow ( Post/SendAsync ) . Почти всегда, когда есть опция async, есть также опция синхронизации. Единственный случай, который я могу вспомнить, когда есть только асинхронная версия WinRT , но это потому, что они препятствуют длительным вызовам синхронизации.


Как упоминал Нед Стоянов, статья Тоуба больше посвящена оболочкам, а не истинным операциям синхронизации / асинхронности.

Ответ №2:

Я думаю, что в статье больше говорится о случае, когда ваш API предоставляет только async реализации, в этом случае клиенту так же легко предоставить реализацию «синхронизация по асинхронности», поэтому вы не добавляете никакого значения, предоставляя ее. Я думаю, что в случае, когда предоставлены оба, вы должны предоставить оба.