【问题标题】:Accessing UI from non-ui thread using dispatcher did not work使用调度程序从非 UI 线程访问 UI 不起作用
【发布时间】:2012-10-02 20:07:34
【问题描述】:

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

【问题讨论】:

    标签: wpf-controls


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-23
      • 2016-09-17
      • 1970-01-01
      • 2012-11-24
      • 1970-01-01
      • 1970-01-01
      • 2015-06-02
      • 2021-10-18
      相关资源
      最近更新 更多