gpt4 book ai didi

绑定(bind)到在工作线程上更新的 observablecollection 的 WPF 元素

转载 作者:行者123 更新时间:2023-12-04 20:35:17 26 4
gpt4 key购买 nike

我处理多线程问题已有一段时间了。在过去的几天里,我一直在努力确保我所有的调用都是线程安全的。我刚刚遇到了一个让我感到困惑的问题。这是场景:

我正在尝试使用 Infragistics XamDataChart 控件绘制波形,该控件传递约 500 点/秒/波形。启动应用程序后,我创建了具有名为 WaveData 的 ObservableCollection 属性的对象,这些属性直接绑定(bind)到 itemscontrol 中的 xaml。当数据进来时,它被存储在一个队列中,一个衍生的工作线程用于使数据出队并在适当的位置更新集合。

产生工作线程:

QueueProcessThread = Task.Factory.StartNew(() => UpdateWaveFormCollections(WaveForms), tokenSource.Token, TaskCreationOptions.LongRunning, TaskScheduler.Default);

更新循环运行的集合的代码(为简洁起见省略了一些代码行):

waveForm.LastDisplayedTimeStamp = DateTime.Now; // move the last displayed time up

int collectionSize = waveForm.WaveData.Count;
while (waveForm.WaveDataBuffer.Count > 0 && waveForm.WaveDataBuffer.Peek().TimeStamp < waveForm.LastDisplayedTimeStamp)
{
if (waveForm.CurrentPosition >= collectionSize)
{
waveForm.CurrentPosition = 0;
}
waveForm.WaveData[waveForm.CurrentPosition] = waveForm.WaveDataBuffer.Dequeue();
waveForm.CurrentPosition++;
}

如您所见,我实际上并没有向集合中添加项/从集合中删除项,而只是更新特定位置的项。这是因为我希望它看起来像医院的病人监护仪。

我遇到的问题是,我意识到我正在非 UI 线程上更新此集合,并且该集合直接绑定(bind)到 Infragistics LineSeries ......这是有效的。但是,当我在预期的非 UI 线程上更新该集合时,另一个使用 Infragistics StepLineSeries 的图形会抛出异常。 我怎么可能在非 UI 线程上更新绑定(bind)的集合?我对此很担心,因为 1) 偶尔我会收到一个错误,即无法在非 UI 线程上更新集合线程和 2) 当我通过调度程序将波形更新切换到 UI 线程时,性能非常糟糕,GUI 无法使用。我需要了解为什么会这样,所以我知道如何进行。我不想部署可能由于我的线程管理不善而随时失败的应用程序。我正在寻找可能的原因/如何在非 UI 线程上更新绑定(bind)的 ObservableCollection。任何帮助/建议将不胜感激。

最佳答案

也许您需要考虑使用 Dispatcher(除非您省略了那部分代码)。

当您执行需要在 UI 线程上执行代码的操作时,您可以使用 Dispatcher 方法。

也许您可以在后台工作线程中检索该数据,并在您更新集合时将更改传播回 UI 线程

例如

Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Background,
new Action(() => methodHere = 50));

关于绑定(bind)到在工作线程上更新的 observablecollection 的 WPF 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14855406/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com