我正在进行一些网络操作,我正在整个网络消息中更新一些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
..所以我不确定我是如何获得重复的条目。
答案 0 :(得分:2)
最有可能的是常规比赛条件。由于您使用DisplayUnit
,我假设代码块可以由多个线程同时运行。然后两个线程都可以进入该块,并且一个接一个地调用Dispatcher.Invoke
。然后他们都会将项目添加到列表框中,结果你有重复的项目。
一般来说,您应该阅读WPF中的绑定和MVVM模式,因为您可以将列表框绑定到字符串数组,并在一次调用中分配该数组,而无需显式调用调度程序。这可以避免这种竞争条件。