UnoPlatform - приложение вызвало интерфейс, который был упорядочен для другого потока. - PullRequest
1 голос
/ 30 мая 2020

Я использую шаблон призмы Uno для своего приложения платформы Uno. После выполнения асинхронного вызова c в приложении UWP. т.е.

var content = await GetHttpContentWithTokenAsync(graphAPIEndpoint,authResult.AccessToken).ConfigureAwait(false);

всякий раз, когда срабатывает метод RaisePropertyChanged (), я получаю следующую ошибку =>
{"Приложение вызвало интерфейс, который был упорядочен для другого потока. (Исключение из HRESULT: 0x8001010E (RPC_E_WRONG_THREAD) ) "}

Git репо => https://github.com/avikeid2007/Repayabl

Файл => https://github.com/avikeid2007/Repayabl/blob/dev/RepayablClient/RepayablClient.Shared/ViewModels/LoginViewModel.cs#L131

1 Ответ

3 голосов
/ 01 июня 2020

Как упоминалось в комментарии, проблема здесь в использовании .ConfigureAwait(false).

С помощью ConfigureAwait(false) вы говорите компилятору: «после выполнения этого ожидаемого метода не возвращайтесь к текущему контексту, я в порядке». В некоторых случаях это может быть подходящая оптимизация или даже защита от взаимоблокировки, особенно когда вы пишете библиотеку классов.

Однако вы обычно не должны использовать ее в обратных вызовах из потока пользовательского интерфейса, например кейс. В UWP и в большинстве UI-фреймворков вы можете изменять UI только из основного UI-потока, иначе вы получите именно ту ошибку, которую упомянули. Итак, вам нужно, чтобы был возвращен в тот же контекст после завершения ожидаемого метода.

TL; DR: Удалить ConfigureAwait(false), не используйте его в async методы, вызываемые из потока пользовательского интерфейса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...