[英]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.