Обновить

Практический подход к миграции большой базы C# кода на async

Уровень сложностиСредний
Время на прочтение5 мин
Охват и читатели5.7K
Всего голосов 6: ↑4 и ↓2+2
Комментарии5

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

Почему бы не использовать обёртку, подобную описанной здесь для оборачивания асинхронного метода в синхронный? Да, это может быть не самым оптимальным решением, но ваш генератор точно не покроет все возможные случаи и скорее всего придётся бороться ещё и с ним. Но мы же переезжаем на асинхронность, так что кажется, что временная деградация производительности может быть приемлемым решением. У вас по-прежнему будет единственный источник правды (асинхронный метод), а синхронный сразу помечать как [Obsolete]

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

Генератор - не мой, но у нас он покрыл все случаи, а таких методов было несколько сотен. Да, генератор не всесилен, но он достаточно хорош для решения обсуждаемой задачи.

Про деградацию склонен согласиться, может быть допустимо в каких-то случаях, но зачем, если можно без неё?

Если я правильно Вас понял, в кодовой базе есть два метода, один асинк, второй синк с обсолетом. Это не означает одного источника правды! Если исправляется баг в асинк методе, его же надо будет исправить и в синк, несмотря на обсолет.

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

Спасибо за мнение!

Товарищ сверху предлагает пользоваться оберткой из ссылки для заворачивания асинхронного метода получения данных в синхронный.

В результате у нас есть полноценный асинхронный метод, он же единственный источник истины, и синхронный метод, помеченный Obsolete и содержащий внутри только вызов асинхронного метода.
return AsyncHelper.RunSync<TUser>(() => manager.FindByIdAsync(userId));

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

Спасибо за статью, пригодится!

Какое количество асинхроннонных методов у вас? Причина? Переход на асинхроннонную либу с вызовом в 1000+ мест?

Асинхроннонность появляется из io, то есть от методов репозитория и распространяется до контроллеров или до main.

Я не понял до конца Ваш комментарий, но методов несколько сотен. Основное - БД, есть также диск и сеть.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации