从Windows运行时组件访问UI线程仅在移动

时间:2018-04-24 11:43:13

标签: c# webview uwp ui-thread winrt-component

我有以下问题。 我使用一个简单的Windows运行时组件在应用程序和WebView之间进行通信。我这样做according to documentation

这是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的{​​{1}}事件中,我在WebView

上致电AddWebAllowedObject
WebView

然后与WebView交互的 private void WebView_NavigationStarting( WebView sender, WebViewNavigationStartingEventArgs args ) { sender.AddWebAllowedObject( "nativeObject", webViewInjectionObject ); } 方法中的代码如下所示。

WebViewInjectionObject_OnNotifyApp

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

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

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

通常使用dspatcher从UI线程进行调用来解决这样的问题。我尝试过跟随

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

但这会导致更深层次的异常

对ASTA的COM调用被阻止,因为调用链来自另一个ASTA或通过另一个ASTA传递。这种呼叫模式容易出现死锁,并且不受公寓呼叫控制的限制。 由于调用链起源于或通过另一个ASTA(线程5964),因此阻止了对ASTA(线程3036)的COM调用(IID:{638BB2DB-451D-4661-B099-414F34FFB9F1},方法索引:6)。这种呼叫模式容易出现死锁,并且不受公寓电话控制的限制。

之后我想到了使用 await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync( Windows.UI.Core.CoreDispatcherPriority.Normal, async () => { await WebView.InvokeScriptAsync( successFunctionName, functionArguments ); } ); 所以我这样做了。 在SynchronizationContext

OnNavigatedTo

然后在syncContext = SynchronizationContext.Current;

WebViewInjectionObject_OnNotifyApp

这又引发了第一个例外。

我不知道接下来该做什么。目标是捕获从Windows运行时组件抛出的事件,然后以适用于桌面和移动设备的方式在 syncContext.Post( async delegate { await WBTWebView.InvokeScriptAsync( successFunctionName, functionArguments ); }, null ); 上调用InvokeScriptAsync

0 个答案:

没有答案