Каков рекомендуемый способ многопоточности с MVVM Light. У меня есть модель с логическим свойством Busy
public bool Busy
{
get { return busy_; }
set
{
Set(nameof(Busy), ref busy_, value, broadcast: true);
}
}
Моя модель представления публикует модель непосредственно для представления (модель наследует ViewModelBase MVVM Light), поэтому представление привязывается непосредственно к свойству Busy модели.
Если я всегда вызываю модель из потока пользовательского интерфейса, все хорошо. Но если я сделаю следующее в своей модели представления, чтобы она могла выполняться в другом потоке
Task.Factory.StartNew(() =>
{
model_.SomeFunctionThatWillSetBusyDuringItsExecution();
});
Затем, конечно, Busy устанавливается из потока, отличного от пользовательского интерфейса, а затем происходит сбой привязки и сбой приложения. Если мне случится использовать Messenger в установщике свойств, кажется, что Messenger автоматически не отправляет код обработчика Messenger в поток пользовательского интерфейса.
Понял, что в MVVM Light есть DispatcherHelper, но для привязки вроде не помогает. Если я изменю свойство на
public bool Busy
{
get { return busy_; }
set
{
DispatcherHelper.CheckBeginInvokeOnUI(() =>
{
Set(nameof(Busy), ref busy_, value, broadcast: true);
});
}
}
Я все еще получаю исключение, и сбой приложения из-за того, что источник привязки находится не в правильном потоке. Итак, мой вопрос прост: каков рекомендуемый способ реализации многопоточности в MVVM Light?
Я также пытался использовать syncronizationContext.
syncContext_.Post(() =>
{
Set(nameof(Busy), ref busy_, value, broadcast: true);
}, null);
Это работает, если вызов всегда происходит из потока, отличного от пользовательского интерфейса. Если вызов уже из потока пользовательского интерфейса, syncContext.Post приводит к тому, что функция Set() не вызывается до тех пор, пока весь код в методе ViewModel не завершится. Это означает, что состояние занятости для оставшегося кода может быть обновлено неправильно. Так что это не идеальное решение.
Я благодарен за помощь в этой теме.