使用调度程序从非ui线程访问UI不起作用

时间:2012-10-02 20:07:35

标签: wpf-controls

我是C#.net的初学者。我在wpf中有一个简单的应用程序,可以从用户线程访问列表框。在winforms我可以使用invokerequired,相当于使用调度程序的wpf没有帮助。我的系统也挂起按钮,所以调试。请为以下代码提供解决方案。提前谢谢

private void Monitor_mtd()
        {
                while (AppStatus != 0)
                {
                    if (flag2 == 1)
                    {
                        listBox1.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
                            new list1MtdDelegate(list1Mtd), "Best practice");

                    }
               }
        }
        private delegate void list1MtdDelegate(string ls1);
        private void list1Mtd(string ls1)
        {
            listBox1.Items.Add(ls1);
        }


        private void button1_Click_1(object sender, RoutedEventArgs e)
        {
            Monitor = new Thread(new ThreadStart(Monitor_mtd));
            Monitor.Start();
            flag1 = 1;
        }
        private void button2_Click(object sender, RoutedEventArgs e)
        {
            flag2 = 1;
        }

1 个答案:

答案 0 :(得分:0)

您的方法中会出现一些问题。首先,将数据绑定到ListBox,然后尝试从用户线程更新ListBox。

您可以使用ObservableCollection解决ListBox的绑定,以便使用必要的值更新UI(有关此内容的详细信息,请查看this帖子)。但是,这也引发了另一个问题,即ObservableCollection不能从另一个调度的线程调用(请参阅此here上的更多内容)。这意味着您需要ObservableCollection的另一个实现。 Thomas Levesque做了一个AsyncObservableCollection,可以从任何线程修改,并在修改后仍然通知用户界面。

我制作了一个示例实现,您可以下载here来显示完整的解决方案。