2016-03-21 2 views
5

Я использую MvvmCross и библиотеку AsyncEx в приложении Windows 10 (UWP).C# блокирующий код в async-методе

В ViewModel, у меня есть свойство INotifyTaskCompletion (1), который является проводной вверх к способу асинхронного в (2)

В (2), я вызвать метод библиотеки асинхронного ViewModel, который:

  • Проверяет локальный кэш
  • Загрузка данных асинхронно
  • Добавляет данные в кэш

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

Q. Каков наилучший способ предотвратить блокировку потока пользовательского интерфейса?

Я понимаю от Stephen Cleary, чтобы не блокировать асинхронный код и не использовать Task.Run в библиотечных методах. Так что я должен ....

Переместить вызовы кэширования в (2), например.

  • Использование Task.Run (для проверки кэша)
  • Вызвать метод библиотека асинхронно
  • Использование Task.Run снова (для кэширования данных)?

Есть ли лучший способ?

+1

У вас есть код, который вы могли бы поделиться? –

+0

Зависит от вашего определения «лучше». Если вы не можете изменить код кэша и хотите использовать async/await, то использование 'Task.Run()' для кода кеширования является «правильным». – Jcl

ответ

3

Если у вас есть полностью синхронный код, который вы не можете изменить, чтобы вернуть его в ожидании, и хотите сделать его асинхронным, тогда да, ваш единственный выбор, если вы хотите использовать async/await, - это использовать Task.Run().

Что-то вроде:

public async Task<T> MyMethod() 
{ 
    T result = await Task.Run(() => CheckCacheOnSyncMethodICantChange()); 
    if(result != null) 
    { 
    result = await MyLibraryMethodThatReturnsATask(); 
    await Task.Run(() => AddToCacheOnSyncMethodICantChange(result)); 
    } 
    return result; 
} 

Должно быть нормально.

+0

Спасибо. Я буду отмечать ваш ответ как правильный. – Howard

+0

Несмотря на мой ответ, и для вашего конкретного случая, кеш должен быть быстрым (именно по этой причине вы его используете) ... Вы уверены, что вам нужно сделать кеш-методы асинхронными? – Jcl

+1

Я использую SQLite.net для кэширования данных в базе данных на основе файлов. Поскольку эта работа не связана с процессором, я хочу сделать это, не блокируя поток пользовательского интерфейса. Я что-то пропустил? – Howard

Смежные вопросы