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