我最近一直在处理多线程问题。在过去的几天中,我一直在尝试确保我的所有调用都是线程安全的。我遇到了一个问题,让我很困惑。以下是情境:
我正在尝试使用Infragistics XamDataChart控件绘制波形,每秒传递约500个点/波形。应用程序启动时,我创建了一些对象,这些对象具有名为WaveData的ObservableCollection属性,并且这些属性直接绑定到xaml中的itemscontrol。当数据到达时,它会存储在队列中并使用生成的工作线程来出列数据并在适当位置更新集合。
如您所见,我实际上并没有向集合中添加/删除项目,而是仅更新特定位置的项目。这是因为我想让它看起来像医院的患者监视器。 我遇到的问题是我意识到我正在非UI线程上更新此集合,并且该集合直接绑定到Infragistics LineSeries...,这是有效的。但是,当我在非UI线程上更新使用Infragistics StepLineSeries的另一个图表时,会抛出异常,这是预期的。我如何能够在非UI线程上更新绑定的集合?这让我感到担忧,因为1)偶尔我确实会收到不能在非UI线程上更新集合的错误,2)当我通过调度程序将波形更新切换到UI线程时,性能非常差,GUI无法使用。我需要了解为什么这项工作,以便知道如何继续。我不想部署由于我的线程管理失误而随时可能失败的应用程序。我正在寻找更新绑定的ObservableCollection在非UI线程上可能是如何/为什么可能的可能原因。任何帮助/建议都将不胜感激。
我正在尝试使用Infragistics XamDataChart控件绘制波形,每秒传递约500个点/波形。应用程序启动时,我创建了一些对象,这些对象具有名为WaveData的ObservableCollection属性,并且这些属性直接绑定到xaml中的itemscontrol。当数据到达时,它会存储在队列中并使用生成的工作线程来出列数据并在适当位置更新集合。
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线程上更新此集合,并且该集合直接绑定到Infragistics LineSeries...,这是有效的。但是,当我在非UI线程上更新使用Infragistics StepLineSeries的另一个图表时,会抛出异常,这是预期的。我如何能够在非UI线程上更新绑定的集合?这让我感到担忧,因为1)偶尔我确实会收到不能在非UI线程上更新集合的错误,2)当我通过调度程序将波形更新切换到UI线程时,性能非常差,GUI无法使用。我需要了解为什么这项工作,以便知道如何继续。我不想部署由于我的线程管理失误而随时可能失败的应用程序。我正在寻找更新绑定的ObservableCollection在非UI线程上可能是如何/为什么可能的可能原因。任何帮助/建议都将不胜感激。