将项添加到列表框通过WPF中的线程使用C#

时间:2017-11-02 11:07:11

标签: wpf listbox thread-safety dispatcher begininvoke

我正在使用下面的代码,但它导致我的应用程序挂起,我不确定为什么。有人能帮助我吗?

 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();
    }

2 个答案:

答案 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();
    }