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

时间:2015-09-14 13:27:00

标签: c# .net multithreading winforms datatable

我有一名后台工作人员使用System.Collections.Concurrent.ConcurrentQueue填充MyClass。然后,我System.ComponentModel.BackgroundWorkerConcurrentQueue清空为System.Data.DataTable。我已将该表公开,以便我可以绑定它来更新WinForms图表。但是,我已经意识到DataTable不是线程安全的。

我可以用什么代替?我喜欢DataTable因为我可以通过向MyClass添加属性来添加列,并且很容易绑定到我的图表。我缺少这个问题的标准解决方案吗?

编辑: 我将绘制大量数据(数百个点数),这就是我想使用绑定的原因。

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
    }
}

1 个答案:

答案 0 :(得分:2)

你必须使用lock语句来同步访问同一对象的线程,即你的情况下的数据表。此外,数据表具有可用于在分配给数据源之前创建新数据表的克隆。这样,DataBind操作将使用永远不会被后台线程修改的数据表。因此收集修改后的问题将得到解决。 尝试以下更改

My.Settings.pnl_service_size = Tb_Pnl_Service_Size.Text
My.Settings.Save()