【发布时间】:2021-11-10 23:31:54
【问题描述】:
我最近将一些图表添加到我正在使用实时数据更新的 WinForm 中。我的表单加载喜欢:
private void MyForm_Load (object sender, EventArgs e){
...bunch of code
//Waveforms
InitializeChartEKG();
InitializeSpO2WaveformChart();
InitializeEtCO2WaveformChart();
FillWaveformCharts();
}
实时图表是这样创建的:
public async void FillWaveformCharts() {
waveformData = AnesthWaveformDatas.CreateWaveformObjects(anestheticRecordNum);
Action action = () =>
FillChartEKG(waveformData);
Invoke(action);
action = () =>
FillChartSpO2(waveformData);
Invoke(action);
action = () =>
FillChartEtCO2(waveformData);
Invoke(action3);
}
然后,在每个 FillChart 方法中,我更新 UI 以使表单不会冻结:
public async void FillChartEKG (List<AnesthWaveformData> waveformData) {
for (i = 0; i < waveformData.Count; i++){
...bunch of code that takes a long time to run...
UpdateUI(); //updates UI to keep form from freezing
}
最后是 UpdateUI(),它更新 UI 以防止表单在图表中更新实时数据时冻结:
private void UpdateUI () {
DispatcherFrame frame = new DispatcherFrame();
Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Render, new
DispatcherOperationCallback(delegate (object parameter) {
frame.Continue = false;
return null;
}), null);
Dispatcher.PushFrame(frame);
}
所以这一切都很好 - 我的图表会随着从右到左的实时数据流进行更新,并且表单根本不会冻结。唯一的问题是,3/4 的表单控件没有在 Form_Load 上绘制。如果我抓住标题栏并移动窗口,控件将立即绘制。
我试过了:
this.Invalidate();
this.Update();
和:
this.Refresh();
在不工作的 FillWaveforms() 方法之后。
这是我在加载时看到的:
如果我抓住标题栏并稍微移动窗口,这就是它的样子:
有什么想法吗?
【问题讨论】:
-
可能值得反复注释掉新代码并查看是什么位引入了问题。从症状来看,它似乎是一个损坏的图形上下文或从错误的线程操纵某些东西。如果您将慢速代码移动到另一个线程,则需要确保绘制结果的线程是正确的。
-
是的,就是这样。使用该解决方案更新了答案。谢谢
-
@WilliamJ.Starck 欢迎您! :)
标签: c# winforms paint livecharts