繁体   English   中英

如何在后台加载所有标签

[英]How to load all tabs in the background

我是WPF(和一般计算机科学)的新手,老板给了我一个小项目,其中有5个选项卡,每个选项卡都转到不同的站点。 登录后,将用户定向到第一个选项卡的网站。 在后台,其他四个选项卡应在后台加载。

每个都有以下名称:“ tabItem1”,“ tabItem2”,“ tabItem3”,“ tabItem4”,最高为“ tabItem5”。每个内部最多包含“ webBrowser5”。

我认为我必须使用线程在后台加载页面,但是我不确定如何实现它。 我尝试在MainWindow中创建4个不同的线程,例如:

public MainWindow()
{
     InitializeComponent();

     Thread thread1 = new Thread(Update1);
     thread1.SetApartmentState(ApartmentState.STA);
     thread1.Start();

     Thread thread2 = new Thread(Update2);
     thread2.SetApartmentState(ApartmentState.STA);
     thread2.Start();

     Thread thread3 = new Thread(Update3);
     thread3.SetApartmentState(ApartmentState.STA);
     thread3.Start();

     Thread thread4 = new Thread(Update4);
     thread4.SetApartmentState(ApartmentState.STA);
     thread4.Start();
}

private void Update1()
    {
      this.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
          (ThreadStart)delegate()
              {
                tabItem2.Focus();
              }
          );
    }

private void Update2()
    {
      this.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
          (ThreadStart)delegate()
              {
                tabItem3.Focus();
              }
          );
    }

//...Goes up to Update4

这似乎只专注于最后一个线程,也没有在后台执行。 感谢您的指导和帮助。 谢谢!

那就是调度程序在主线程上执行的操作。 您告诉主线程设置焦点,因为该对象位于主线程上。

问题:

答案在于为什么必须这样做。 除了在其上创建的线程之外,不能在任何其他线程上的Windows控件上进行操作。 您也不能在一个线程中创建控件,而在另一个线程中将其设置为控件的子级。

这对您意味着...是您老板要求您做的事情无法完成。 您在后台唯一可以做的就是计算算法。 充其量,您将能够加载数据 ,对数据进行操作并解释数据 ,但如果要在Windows控件中显示或将其转换为数据,则必须在主线程上执行此操作。

唯一的解决方案:

但是,您可以有多个UIThreads。 这意味着您可以创建多个Window 因此,必须做的选择是在每个选项卡内容的单独线程上创建窗口,然后在每个选项卡上托管线程窗口。

穿线窗

主机进程窗口

跨线程托管

我不同意Xaade,我认为您可以仅使用以下代码即可完成所需的工作:

Dispatcher.BeginInvoke((Action)(() =>
{
        //  load the pages
}), DispatcherPriority.Background, null);

该代码将在后台执行,因此,您可以在其中加载所需的每个webBrowser。

您只需要将DispatcherPriority指定为Background

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM