在后台任务

时间:2015-11-10 12:12:13

标签: c# angularjs windows-10

我正在创建一个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以在单独的线程上运行。

有没有办法做到这一点?我正在研究,所以我接受任何帮助或想法。

1 个答案:

答案 0 :(得分:0)

有一种误解。您必须在UI线程上创建WebView。

SeparateThread执行模式意味着webview将处理并显示非UI线程上的内容,以提高特定方案的性能。它不允许您启动新线程并在其上创建webview实例。线程会自动创建,您将无法管理它。

如果我们有一个繁忙的用户界面并且我们要加载很多内容,为了避免在UI上阻塞,我们可能会启动一个新线程来加载数据并首先显示控件。这使得UI响应迅速。实际上,SeparateThread执行模式也做了类似的事情。

所以你需要UI线程活着。