1

クロススレッド例外をスローしているdataGridViewにバインドした別のスレッドからデータを受け取るデータ構造(bindingList)があります。dataBound である 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));
}
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 に答える