c# - 从 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;
然后在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
解决方案
推荐阅读
- android - 允许在 attrs.xml 中使用像“wrap_content”这样的值
- php - Laravel 关联关系,如果不存在则创建
- angular - FormControl 属性的 SplitPipe 不起作用
- powerbi - 运行日期和切片类别的总计 - 返回的日期不正确
- scala - Scala中参数函数参数的运行时控制
- excel - 当我将另存为 CSV 时,它会将 true/false 更改为 TRUE/FALSE
- html - Thymeleaf + CSS:弹性方向在 Thymeleaf 中的工作方式不同?
- python-3.x - 如何在 python 代码中突出显示控制台输出?
- php - 使用 $wpdb->get_results 时如何对表数据进行排序
- objective-c - 是否有任何最新资源可以解释 MacOS 的 AuthenticationPlugin 开发?