如何绑定到另一个线程中填充的数据
本文关键字:线程 填充 数据 另一个 何绑定 绑定 | 更新日期: 2023-09-27 18:12:35
我有一个后台工作人员用MyClass
填充System.Collections.Concurrent.ConcurrentQueue
。然后我有一个System.ComponentModel.BackgroundWorker
将ConcurrentQueue
排空成System.Data.DataTable
。我把这个表设为公共的,这样我就可以绑定到它来更新WinForms图表。然而,我已经意识到DataTable
不是线程安全的。
我可以用什么代替?我喜欢DataTable
,因为我可以简单地通过向MyClass添加属性来添加列,并且它很容易绑定到我的图表。有没有一个标准的解决方案,我错过了这个问题?
编辑:我将绘制大量数据(成千上万个点),这就是为什么我想使用binding -来提高性能。
Form_main.cs:
public Form_main()
{
InitializeComponent();
// ... add some series data
chart_highLevel.DataSource = MyClass.dt; // this being populated in a BackgroundWorker in MyClass
}
private void timer_updateGui_Tick(object sender, EventArgs e)
{
chart_highLevel.DataBind(); // Update the databind
}
MyClass.cs
public DataTable dt = {get; private set;}
private void bw_analyser_DoWork(object sender, DoWorkEventArgs e)
{
while(true)
{
// ... populate 'values'
dt.Rows.Add(values); // values are the data to fill the DataTable, dt
}
}
你必须使用锁语句来同步线程访问相同的对象,即数据表在你的情况下。此外,数据表具有克隆功能,可以在分配数据源之前创建新的数据表。这样,DataBind操作将使用的数据表将永远不会被后台线程修改。因此,收集被修改的问题将得到解决。试试下面的修改
private void timer_updateGui_Tick(object sender, EventArgs e)
{
lock(MyClass.dt)
{
chart_highLevel.DataSource = MyClass.dt.Copy();
}
chart_highLevel.DataBind(); // Update the databind
}
public DataTable dt = {get; private set;}
private void bw_analyser_DoWork(object sender, DoWorkEventArgs e)
{
while(true)
{
// ... populate 'values'
lock(dt)
{
dt.Rows.Add(values); // values are the data to fill the DataTable, dt }
}
}