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