Доступ к потоку пользовательского интерфейса из компонента среды выполнения Windows вызывает исключение только на мобильном устройстве
У меня следующая проблема. Я использую простой компонент среды выполнения Windows для связи между приложением и WebView
, Я делаю это в соответствии с документацией
Это код для компонента времени выполнения Windows
public delegate void NotifyAppHandler( string str );
[AllowForWeb]
public sealed class WebViewInjectionObject
{
public event NotifyAppHandler OnNotifyApp;
public void NotifyApp( string str )
{
OnNotifyApp?.Invoke( str );
}
}
в OnNavigatedTo
метод, который я инициализирую WebViewInjectionObject
и подписаться на OnNotifyApp
событие.
webViewInjectionObject = new WebViewInjectionObject();
webViewInjectionObject.OnNotifyApp += WebViewInjectionObject_OnNotifyApp;
Тогда на NavigationStarting
событие WebView
Я звоню AddWebAllowedObject
на WebView
private void WebView_NavigationStarting( WebView sender, WebViewNavigationStartingEventArgs args ) {
sender.AddWebAllowedObject( "nativeObject", webViewInjectionObject );
}
Код в WebViewInjectionObject_OnNotifyApp
метод, который затем взаимодействует с WebView, выглядит следующим образом.
if (somethingGood) {
await WebView.InvokeScriptAsync( successFunctionName, functionArguments );
}
При запуске этого на рабочем столе (версия 1709, сборка 16299.371) все работает нормально.
При запуске этого на мобильном телефоне (версия 1709 и версия 1607) я получаю это исключение.
Приложение называло интерфейс, который был назначен для другого потока. (Исключение из HRESULT: 0x8001010E (RPC_E_WRONG_THREAD))
Обычно такие исключения решаются с помощью dspatcher для вызова из потока пользовательского интерфейса. Я пытался сделать следующее
await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync( Windows.UI.Core.CoreDispatcherPriority.Normal, async () =>
{
await WebView.InvokeScriptAsync( successFunctionName, functionArguments );
} );
Но это приводит к более глубокому исключению
COM-вызов ASTA был заблокирован, потому что цепочка вызовов возникла или прошла через другую ASTA. Этот образец вызова является склонным к тупику и запрещен контролем вызова квартиры. Вызов COM (IID: {638BB2DB-451D-4661-B099-414F34FFB9F1}, индекс метода: 6) для ASTA (поток 3036) был заблокирован, поскольку цепочка вызовов возникла в другой ASTA (поток 5964) или прошла через нее. Этот образец вызова является склонным к тупику и запрещен контролем вызова квартиры.
После этого я подумал об использовании SynchronizationContext
так что я сделал это В OnNavigatedTo
syncContext = SynchronizationContext.Current;
А потом в WebViewInjectionObject_OnNotifyApp
syncContext.Post( async delegate
{
await WBTWebView.InvokeScriptAsync( successFunctionName, functionArguments );
}, null );
Это снова приводит к первому исключению.
Я в недоумении от того, что делать дальше. Цель состоит в том, чтобы перехватить событие, выброшенное из компонента среды выполнения Windows, а затем вызвать InvokeScriptAsync
на WebView
таким образом, что работает как для настольных компьютеров, так и для мобильных устройств.