UPDATEWPF UI更新线程问题
我已经解决了这个问题。我发现我没有正确同步对线条和图表对象的访问。我没有在处理程序期间锁定它们,而是仅在使用它们的那一刻锁定它们。我认为动态数据显示库内的某些东西正在使用延迟执行,并且当我不期待它时尝试访问其中一个对象。
TL; DR:正确同步锁。
我目前正在使用WPF的图形用户界面来可视化某些类库中的算法。我在GUI中使用的所有控件都是标准WPF或Microsoft Dynamic Data Display库。
我越来越常见“调用线程无法访问此对象,因为不同的线程拥有它”错误。我已经做了大量的搜索,但是无法自己找到解决方案。
现在,我有点困惑,如果线程不拥有它,如何向图表添加行。我已经尝试过使用调度程序,因为本网站提供了许多其他答案,但它并未解决此问题。
摘要窗口打算成为主窗口的子窗口,它在模拟运行并实时显示数据之前打开。
模拟器出版了许多其全部异步处理的事件(在内部,它使用的BeginInvoke和EndInvoke)的。这可能会导致这种情况下的问题?
摘要视图模型注册了一些可视化,这反过来又创建他们自己的控制,并将它们添加到由所述概要窗口提供的画布的。代码
一个非常简短的概要如下
public class MainWindowModel
{
//...
public async void RunSimulation()
{
WindowService.OpenWindowFor<SimulationSummaryViewModel>(SimSummaryVM);
await Simulator.Run();
}
}
public class SimulatorSummaryViewModel
{
//...
public SimulatorSummaryViewModel()
{
Visualisations.Add(new RealTimeChart());
}
//...
}
public class RealTimeChart : IVisualisation
{
// ...
private ChartPlotter _Chart; //From Dynamic Data Display library
//Handles adding information to the current line
private void OnSimulatorStepHandler(Args a)
{
/* The exception occurs in here, when adding a data point,
whilst another handler is adding a line to the chart.
I have tried adding a lock to the chart and line objects, but it had no effect
*/
}
//Handles adding the current line to the chart
private void OnSimulatorRepetitionComplete(Args a)
{
//lineToAdd is an EnumerableDataSource<DataPoint>.
//DataPoint is a simple class with two primitive properties.
_Chart.Dispatcher.Invoke(new Action(()=>
{
_Chart.AddLineGraph(lineToAdd);
}));
}
}
public class SummaryWindow : Window
{
// ...
public SummaryWindow()
{
// ...
foreach(IVisualisation Vis in ViewModel.Visualisations)
{
Vis.Draw(this.VisCanvas);
}
}
}
lineToAdd是什么类型? – sim1 2013-03-07 13:50:28
这是一个EnumerableDataSource其中数据点是具有两个基本属性的某个内部类。我会将其添加到我的问题。 –
AndyBursh
2013-03-07 13:53:54
你可以更具体的OnSimulatorStepHandler的内容? – sim1 2013-03-07 14:04:16