1

我是 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;
        }
4

1 回答 1

0

您的方法中出现了几个问题。首先,将数据绑定到 ListBox 的方式,其次尝试从用户线程更新 ListBox。

您可以通过使用 ObservableCollection 解决 ListBox 的绑定问题,以便使用必要的值更新 UI(有关此内容的更多信息,请查看这篇文章)。然而,这也引发了另一个问题,那就是 ObservableCollection 不能从另一个线程调用,而不是它正在调度的线程(也可以在此处查看更多信息)。这意味着您需要 ObservableCollection 的另一个实现。Thomas Levesque 制作了一个AsyncObservableCollection,可以从任何线程进行修改,并且在修改时仍会通知 UI。

我做了一个示例实现,您可以在此处下载它,显示完整的解决方案。

于 2012-10-19T11:08:39.063 回答