如何绑定到另一个线程中填充的数据

本文关键字:线程 填充 数据 另一个 何绑定 绑定 | 更新日期: 2023-09-27 18:12:35

我有一个后台工作人员用MyClass填充System.Collections.Concurrent.ConcurrentQueue。然后我有一个System.ComponentModel.BackgroundWorkerConcurrentQueue排空成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          }
    }
}