我正在创建一个Windows 10 Universal应用程序,其中程序在WebView(单页AngularJS应用程序)中运行,Windows应用程序通过WebView与它通信。当应用程序在前台时,它没有任何问题,但我也必须从BackgroundTask调用JavaScript函数。
正如我所看到的,如果在构造函数中将ExecutionMode属性设置为SeparateThread,则Windows 10中可能会在单独的线程而不是UI线程中运行WebView。我试图在BackgroundTask中使用这个方法,但我仍然有一个例外,我正在尝试创建一个在不同线程上编组的对象。
以下是代码段:
public void Run(IBackgroundTaskInstance taskInstance)
{
var deferral = taskInstance.GetDeferral();
var tmp = WebView.DefaultExecutionMode;
var webView = new WebView(WebViewExecutionMode.SeparateThread);
var notificationService = new NotificationService(new BrowserBase { Browser = webView, IsOnUIThread = false });
notificationService.Notification("ExampleCall");
deferral.Complete();
}
我查了一些其他的东西。我只是在布局上放了一个按钮,并将这个RelayCommand绑定到它:
public RelayCommand Test
{
get
{
return new RelayCommand(() =>
{
Task.Run(() =>
{
var tmp = new WebView(WebViewExecutionMode.SeparateThread);
tmp.Navigate(_appBaseUri);
});
});
}
}
如图所示,我在非UI线程中创建了一个WebView实例,但是我仍然遇到异常,甚至很难创建WebView以在单独的线程上运行。
有没有办法做到这一点?我正在研究,所以我接受任何帮助或想法。
答案 0 :(得分:0)
有一种误解。您必须在UI线程上创建WebView。
SeparateThread执行模式意味着webview将处理并显示非UI线程上的内容,以提高特定方案的性能。它不允许您启动新线程并在其上创建webview实例。线程会自动创建,您将无法管理它。
如果我们有一个繁忙的用户界面并且我们要加载很多内容,为了避免在UI上阻塞,我们可能会启动一个新线程来加载数据并首先显示控件。这使得UI响应迅速。实际上,SeparateThread执行模式也做了类似的事情。
所以你需要UI线程活着。