Dispatcher.Invoke似乎正在执行异步或根本不执行,有时

时间:2016-05-26 20:04:56

标签: c# wpf

我正在进行一些网络操作,我正在整个网络消息中更新一些WPF元素。

我有listbox个“客户”,每次有新连接时我都会更新。

所以,在连接上;

Dispatcher.Invoke(() =>
    {
        listBox.Items.Clear();
    });

        for (i = 0; i < waitingMachines.Count; i++) {
            sb.Clear();
            sb.Append((i + 1).ToString() + ") " + waitingMachines[i].Name + " - " + waitingMachines[i].CurrentMeasurement);
            Dispatcher.Invoke(() =>
            {
                listBox.Items.Add(sb.ToString());
            });
        }

有时似乎listBox.Items.Clear();根本没有被执行,我最终在列表框中有两个相同的条目。

如果我要理解Invoke,它应该清除列表才能执行下一个Invoke ..所以我不确定我是如何获得重复的条目。

1 个答案:

答案 0 :(得分:2)

最有可能的是常规比赛条件。由于您使用DisplayUnit,我假设代码块可以由多个线程同时运行。然后两个线程都可以进入该块,并且一个接一个地调用Dispatcher.Invoke。然后他们都会将项目添加到列表框中,结果你有重复的项目。

一般来说,您应该阅读WPF中的绑定和MVVM模式,因为您可以将列表框绑定到字符串数组,并在一次调用中分配该数组,而无需显式调用调度程序。这可以避免这种竞争条件。