【问题标题】:Run WebView in a Backgroundtask在后台任务中运行 WebView
【发布时间】:2023-03-05 14:31:01
【问题描述】:

我正在创建一个 Windows 10 通用应用程序,其中程序在 WebView(单页 AngularJS 应用程序)中运行,并且 Windows 应用程序通过 WebView 与其通信。当应用程序在前台时,它没有问题,但我也必须从 BackgroundTask 调用 JavaScript 函数。

我可以看到,如果在构造函数中将 ExecutionMode 属性设置为SeparateThread,Windows 10 中就有可能在单独的线程而不是 UI 线程中运行 WebView。我尝试在 BackgroundTask 中使用此方法,但仍然遇到异常,我正在尝试创建一个在不同线程上编组的对象。

这是一个代码sn-p:

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 以在单独的线程上运行,我仍然遇到异常。

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

【问题讨论】:

    标签: c# angularjs windows-10


    【解决方案1】:

    有误会。您必须在 UI 线程上创建 WebView。

    SeparateThread 执行模式意味着 webview 将在非 UI 线程上处理和显示内容,以提高特定场景的性能。这不是让您启动一个新线程并在其上创建 webview 实例。线程是自动创建的,您将无法管理它。

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

    所以你需要 UI 线程活着。

    【讨论】:

    • 非常感谢您的回答。当我昨天做了一些进一步的研究时,我得出了同样的结论。这是非常不幸的,因为如果我能够在非 UI 线程中创建 webView 对我来说会容易得多,因为我必须在网页上运行 JS ServiceCalls。现在,我必须为此找到解决方法。您对如何在非 UI 线程上运行来自某个网​​页的 JavaScript 有什么建议吗?如果它有帮助,我也有网页的完整源代码。
    • 你找到解决这个问题的方法了吗?
    猜你喜欢
    • 1970-01-01
    • 2016-09-05
    • 2015-05-05
    • 1970-01-01
    • 2020-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多