Как вызвать обработчик PropertyChanged из другого потока

155
15 ноября 2019, 06:40

Из ViewModel оформлена подписка на события класса C1. В классе C1 запущен асинхронный метод, в процессе работы которого генерируются события. Обработчик изменяет свойство в ViewModel:

private void onBeginLoadProducts()
{
    StatusMsg = "Ожидание ответа";
}
private void onEndLoadProducts()
{
    StatusMsg = "Ответ получен";
}

....

public string StatusMsg
{
    get
    {
        return this.statusMsg;
    }
    private set
    {
        this.statusMsg = value;
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("StatusMsg"));
    }
}

На вызове PropertyChanged происходит ошибка:

System.Exception: "Приложение обратилось к интерфейсу, относящемуся к другому потоку. (Exception from HRESULT: 0x8001010E (RPC_E_WRONG_THREAD))"

К свойству StatusMsg есть привязка(x:Bind) из UI. Я знаю, что обращаться к UI элементам можно только из главного потока, но каким образом решить данную задачу? Объект который генерирует событие, выполняет асинхронный метод, когда закончит неизвестно. А иметь контроль состоянии о выполнении нужно. Спасибо.

Answer 1

Пробросьте в VM диспетчер UI-потока, например, параметром конструктора или получите его внутри VM:

var dispatcher = Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher;

затем, при необходимости запуска кода в UI-потоке, используйте его:

await dispatcher.RunAsync(
    Windows.UI.Core.CoreDispatcherPriority.Normal,
    () => StatusMsg = "Ожидание ответа"); // onBeginLoadProducts);
Answer 2

Код после корректировок:

using Windows.UI.Core;
private CoreDispatcher dispatcher = Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher;
private async void OnBeginLoadProducts()
{
    await dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => StatusMsg = "Запрос на получение продуктов");
}
READ ALSO
Проблема с двойным прыжком на Unity

Проблема с двойным прыжком на Unity

у меня есть проблема с игрой на UnityЯ решил сделать небольшую игру типа платформера, есть проблема с прыжком, если очень много раз нажимать...

153
Кастомный шрифт 2

Кастомный шрифт 2

Нашёл ответ на свой вопрос, вродь) Вот https://stackoverflowcom/questions/1297264/using-custom-fonts-on-a-label-on-winforms

145
Ошибка CS0122. C# is inaccessible due to its protection level

Ошибка CS0122. C# is inaccessible due to its protection level

Не могу понять почему не создаётся объект классаОба класса объявлены в одном пространстве имён

321
Разрешить inline-style по “белому списку”

Разрешить inline-style по “белому списку”

На своём сайте я использую Mathquill, который для корректного изображения встраивает стили в код страницыНапример:

106