Доступ к потоку пользовательского интерфейса из компонента среды выполнения 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 таким образом, что работает как для настольных компьютеров, так и для мобильных устройств.

0 ответов

Другие вопросы по тегам