C# 用户界面没有';t反映了从另一个线程触发的更改

C# 用户界面没有';t反映了从另一个线程触发的更改,c#,wpf,multithreading,C#,Wpf,Multithreading,我有一个WPF应用程序,UI部分可以简单地理解为一个ListBox,它ItemsSource绑定到一个IList对象,假设IList对象实例是classInstances,虽然ListBox中的每个UI项只是一个复选框,IsChecked属性是classInstances中的每个项的2路绑定,更具体地说,绑定是在布尔属性allowering上的,然后我可以操纵allowering来控制UI,就像每个WPF应用程序一样 现在假设classInstances中有4个项目,那么同样应该在ListBox

我有一个WPF应用程序,UI部分可以简单地理解为一个
ListBox
,它
ItemsSource
绑定到一个IList对象,假设IList对象实例是
classInstances
,虽然ListBox中的每个UI项只是一个复选框,
IsChecked
属性是classInstances中的每个项的2路绑定,更具体地说,绑定是在布尔属性
allowering
上的,然后我可以操纵
allowering
来控制UI,就像每个WPF应用程序一样

现在假设
classInstances
中有4个项目,那么同样应该在
ListBox
中有4个复选框,所有4个复选框都默认处于未选中的状态,然后我有一个线程池线程来及时扫描所有的“Allowering”属性,如果它们为false,则按预期将其设置为true,应选中所有4个复选框,逻辑将大大简化:

// we have 4 instance in a IList, each instance 2 way bind to a checkbox, of course 
//implement INotifyPropertyChanged
foreach (var oneInstance in classInstances)
{
    var safeInstance = oneInstance;
    ThreadPool.QueueUserWorkItem((o) =>
    {
        // start message handle loop
        while (true)
        {
            // 'AllowEntering' was bind to checkbox's 'IsChecked' property.
            if (safeInstance.AllowEntering == false)
            {
                // this should make the checkbox get checked!
                safeInstance.AllowEntering = true;
            }

            Thread.Sleep(5000);
        }
    });
}

问题是,有时最后一个复选框没有被选中,但其他复选框总是好的,唯一不同的是列表框有一个滚动条(垂直),第四个复选框由于窗口小而默认隐藏,然后我向下滚动以显示第四个复选框,以后会检查的!这真让我困惑,请帮助。

您使用的是虚拟化StackPanel吗

您所描述的行为的原因是未更新的复选框实际上不存在(它不在列表框中)。当您滚动时,它会自动添加,并变得可见


在这种情况下,使用多个线程与此无关。

您是从非UI线程更新UI。你不允许那样做。您需要在UI线程上调用所有UI更改。执行更新的代码在哪里?此外,阻止ThreadQueue线程会浪费一个有价值的线程,并且与使用普通的旧线程相比没有任何好处。
每个WPF应用程序将要做的
实际上是将复选框数据绑定到ViewModel属性并引发PropertyChanged事件。WPF将负责从属性更新UI,以避免交叉线程消息过滤对于这种类型的同步使用不起作用(不会阻止竞速情况)
lock
非常好!从来没有想过WPF有这样的优化,但它真的让我卡住了好几天!