Я использую MvvmCross и библиотеку AsyncEx в приложении Windows 10 (UWP).C# блокирующий код в async-методе
В ViewModel, у меня есть свойство INotifyTaskCompletion (1), который является проводной вверх к способу асинхронного в (2)
В (2), я вызвать метод библиотеки асинхронного ViewModel, который:
- Проверяет локальный кэш
- Загрузка данных асинхронно
- Добавляет данные в кэш
Код кеширования нельзя сделать асинхронным, поэтому библиотечный метод содержит как блокирующий, так и асинхронный код.
Q. Каков наилучший способ предотвратить блокировку потока пользовательского интерфейса?
Я понимаю от Stephen Cleary, чтобы не блокировать асинхронный код и не использовать Task.Run в библиотечных методах. Так что я должен ....
Переместить вызовы кэширования в (2), например.
- Использование Task.Run (для проверки кэша)
- Вызвать метод библиотека асинхронно
- Использование Task.Run снова (для кэширования данных)?
Есть ли лучший способ?
У вас есть код, который вы могли бы поделиться? –
Зависит от вашего определения «лучше». Если вы не можете изменить код кэша и хотите использовать async/await, то использование 'Task.Run()' для кода кеширования является «правильным». – Jcl