首页 > 解决方案 > 从 Windows 运行时组件访问 UI 线程仅在移动设备上引发异常

问题描述

我有以下问题。我正在使用一个简单的 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;    

然后在NavigationStartingWebView打电话AddWebAllowedObject的情况下WebView

 private void WebView_NavigationStarting( WebView sender, WebViewNavigationStartingEventArgs args ) {
        sender.AddWebAllowedObject( "nativeObject", webViewInjectionObject );
    }

然后与 WebView 交互的方法中的代码WebViewInjectionObject_OnNotifyApp如下所示。

if (somethingGood) {
    await WebView.InvokeScriptAsync( successFunctionName, functionArguments ); 
}

在桌面(版本 1709,内部版本 16299.371)上运行它时,一切正常。

在手机(版本 1709 和版本 1607)上运行它时,我得到了这个异常。

应用程序调用了为不同线程编组的接口。(来自 HRESULT 的异常:0x8001010E (RPC_E_WRONG_THREAD))

通常通过使用 dspatcher 从 UI 线程进行调用来解决此类欺骗。我试着做followig

 await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync( Windows.UI.Core.CoreDispatcherPriority.Normal, async () =>
      {
           await WebView.InvokeScriptAsync( successFunctionName, functionArguments );
      } );

但这导致了更深层次的例外

对 ASTA 的 COM 调用被阻止,因为调用链源自或通过另一个 ASTA。这种呼叫模式容易发生死锁,并且被公寓呼叫控制所禁止。对 ASTA(线程 3036)的 COM 调用(IID:{638BB2DB-451D-4661-B099-414F34FFB9F1},方法索引:6)被阻止,因为调用链源自或通过另一个 ASTA(线程 5964)。这种呼叫模式容易发生死锁,并且被公寓呼叫控制所禁止。

之后我想到了使用,SynchronizationContext所以我这样做了。在OnNavigatedTo

syncContext = SynchronizationContext.Current;

然后在WebViewInjectionObject_OnNotifyApp

 syncContext.Post( async delegate
        {
             await WBTWebView.InvokeScriptAsync( successFunctionName, functionArguments );
        }, null );

这再次导致第一个例外。

我不知道下一步该做什么。目标是捕获从 Windows 运行时组件引发的事件,然后以适用于桌面和移动设备的方式调用InvokeScriptAsync该事件。WebView

标签: c#webviewuwpui-threadwinrt-component

解决方案


推荐阅读