我正在使用下面的代码,但它导致我的应用程序挂起,我不确定为什么。有人能帮助我吗?
void put_items() {
listb.Dispatcher.BeginInvoke(new Action(() =>
{
for (int i = 0; i < 9000000; i++)
{
listb.Items.Add(i.ToString());
}
}));
}
private void Button_Click(object sender, RoutedEventArgs e)
{
Thread mythread = new Thread(put_items);
mythread.Start();
}
答案 0 :(得分:0)
如果要更新任何UI控件,必须在UI线程中完成。通过使用Dispatcher,您可以强制应用程序执行BeginInvoke-block中的代码,以便在ui线程上执行。
根据for循环中一个项目的工作耗时,您可以处理一堆项目(例如10或100),然后使用调度程序更新ui。请注意,每次调用Dispatcher.BeginInvoke都需要一些时间(可能是500毫秒)。
另一种方法是使用事件聚合器,请参阅here。然后,包含按钮单击方法的类将注册到事件聚合器,在线程中您只需要聚合器的实例并调用ea.Publish(new YourCustomEvent(yourItemToUpdateUI))。
如果您的应用程序变得复杂,这种方法非常好。
答案 1 :(得分:-1)
谢谢,但我认为该代码在netframwork 3.5中不起作用我认为我通过此代码解析
public void put_items()
{
for (int i = 0; i < 999999999; i++)
{
this.Dispatcher.Invoke(new Action (() =>
{
listb.Items.Add(i.ToString());
}));
}
}
private void Button_Click(object sender, RoutedEventArgs e)
{
new Thread(put_items).Start();
}