1

我有一个数据结构(bindingList),它从另一个线程接收数据,我已经绑定到一个抛出跨线程异常的dataGridView。如何调用 dataGridView 是 dataBound?这是一个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));
}
4

1 回答 1

3

Control.Invoke从另一个线程修改控件时需要使用:

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

首先,您检查是否Control.InvokeRequired. 如果是这样,则Invoke()使用委托调用相同的函数,然后返回。它将从 GUI 线程重新进入函数,InvokeRequired将是false,并且控件将被更新。

于 2012-07-28T05:52:34.113 回答