我是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
这似乎只关注最后一个线程,而且它不是背景。我感谢任何指导和帮助。谢谢!
答案 0 :(得分:1)
这就是调度员正在做的事情,在主线程上运行。你告诉主线程设置焦点因为对象在主线程上。
问题:
答案在于为什么你必须这样做。 您无法在其创建的线程之外的任何其他线程中对Windows控件进行操作。您也无法在一个线程中创建控件,并将其设置为另一个线程中控件的子控件
这对你意味着什么......是你老板要求你做的事情无法做到的。您在后台可以做的唯一事情是计算算法。充其量,您将能够加载数据,并对数据进行操作,并解释数据,但是如果您想拥有该数据要在Windows控件中显示或转换为它,您必须在主线程上执行此操作。
唯一的解决方案:
但是,您可以拥有多个UIThread。这意味着您可以创建多个Window
。因此,必须做的选择是在每个选项卡内容的不同线程上创建窗口,然后在每个选项卡上托管线程窗口。
答案 1 :(得分:0)
我不同意Xaade,我认为只使用此代码就可以完成所需的操作:
Dispatcher.BeginInvoke((Action)(() =>
{
// load the pages
}), DispatcherPriority.Background, null);
该代码将在后台执行,因此,您可以加载所需的每个webBrowser。
您只需将DispatcherPriority指定为Background
。