2

我是 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

这似乎只关注最后一个线程,也没有在后台进行。我感谢任何指导和帮助。谢谢!

4

2 回答 2

1

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

问题:

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

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

唯一的解决方案:

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

线程窗口

主机进程窗口

跨线程托管

于 2012-07-24T21:21:00.233 回答
-1

我不同意 Xaade,我认为您可以只使用以下代码来做您需要的事情:

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

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

您只需要将 DispatcherPriority 指定为Background.

于 2012-07-24T22:00:15.060 回答