如何在后台加载所有选项卡

时间:2012-07-24 21:16:10

标签: c# wpf

我是WPF(以及一般的计算机科学)的新手,我从老板那里获得了一个小项目,其中有5个标签,每个标签都转到不同的网站。登录后,用户将被定向到第一个选项卡的网站。在后台,其他4个选项卡应在后台加载。

每个都有以下名称:“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

这似乎只关注最后一个线程,而且它不是背景。我感谢任何指导和帮助。谢谢!

2 个答案:

答案 0 :(得分:1)

这就是调度员正在做的事情,在主线程上运行。你告诉主线程设置焦点因为对象在主线程上。

问题:

答案在于为什么你必须这样做。 您无法在其创建的线程之外的任何其他线程中对Windows控件进行操作。您也无法在一个线程中创建控件,并将其设置为另一个线程中控件的子控件

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

唯一的解决方案:

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

Threading windows

Host process window

Cross thread hosting

答案 1 :(得分:0)

我不同意Xaade,我认为只使用此代码就可以完成所需的操作:

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

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

您只需将DispatcherPriority指定为Background