C# 使用来自另一个线程的数据绑定网格

C# 使用来自另一个线程的数据绑定网格,c#,winforms,C#,Winforms,我有一个数据结构(bindingList),它从另一个线程接收数据,我绑定到一个dataGridView,该dataGridView引发了一个跨线程异常。如何调用数据绑定的dataGridView?这是一个winForm项目。为了清楚起见,这里有一个我所说的例子: DataStore dStore = new DataStore(); dStore.ReceiveData += new ReceiveDataEventHndlr(data); BindingList<mydataobj&g

我有一个数据结构(bindingList),它从另一个线程接收数据,我绑定到一个dataGridView,该dataGridView引发了一个跨线程异常。如何调用数据绑定的dataGridView?这是一个winForm项目。为了清楚起见,这里有一个我所说的例子:

DataStore dStore = new DataStore();
dStore.ReceiveData += new ReceiveDataEventHndlr(data);
BindingList<mydataobj> myDataStructure = new BindingList<mydataobj>();
dataGridView.DataSource = myDataStructure;

// here's my cross threading issue
private void data(string s, double d)
{
    myDataStructure.Add(new MyDataObj(s,d));
}
DataStore dStore=新数据存储();
dStore.ReceiveData+=新的ReceiveDataEventHndlr(数据);
BindingList myDataStructure=新建BindingList();
dataGridView.DataSource=myDataStructure;
//这是我的交叉线程问题
专用void数据(字符串s,双d)
{
添加(新的MyDataObj(s,d));
}
从另一个线程修改控件时需要使用:

private void data(string s, double d)
{
    if (this.InvokeRequired) {
        this.Invoke(new Action( () => {data(s, d);} ));
        return;
    }
    myDataStructure.Add(new MyDataObj(s,d));
}

首先,你要检查一下。如果是,则使用同一函数的委托调用
Invoke()
,然后返回。它将从GUI线程重新输入函数,
invokererequired
将为
false
,控件将被更新。

哦,好吧……我不知道在数据结构上调用会解决这个问题。我想我必须调用dataGridViewNo,你需要。您可以在我不了解的控件(dataGridView)上调用Invoke。也许我应该进一步澄清:我的dataGridView在我的表示层(GUI)中。我的数据结构和数据存储在我的业务逻辑层(BAL)内。我的dStore和myDataStructure除了通过数据绑定之外,不会与我的dataGridView交互……将myDataStructre传递到GUI进行绑定,就是这样。嘿,解决方案是thx。我现在明白了。是的,你给我的例子是正确的方法。又来了!该示例也是一种使用LINQ和泛型委托的干净且更新的“.NET建议”方法。再次谢谢!