2

要素が作成されたスレッド以外のスレッドからプログラムのビューを更新するたびに、次を使用します。

if (this.table.InvokeRequired)
{
    this.table.Invoke(new MethodInvoker(delegate
    {
        this.table.Controls.Add(newRow);
        this.table.Controls.SetChildIndex(newRow, this.table.Controls.Count);
    }));
}
else
{
    this.table.Controls.Add(newRow);
    this.table.Controls.SetChildIndex(newRow, this.table.Controls.Count);
}

このアプローチは問題なく機能しますが、それ以降、この方法を使用するのがベストプラクティスであるとは思えません。

this.table.Controls.Add(newRow);
this.table.Controls.SetChildIndex(newRow, this.table.Controls.Count); 

呼び出す場合と呼び出さない場合は基本的に同じです。

どうすればそれを改善できるか考えていますか?

4

2 に答える 2

3

それをメソッドに入れると、メソッドはそれ自体を呼び出すことができます。

public void addRow(Control newRow) {
  if (this.table.InvokeRequired) {
    this.table.Invoke(new MethodInvoker(addRow), new object[]{ newRow });
  } else {
    this.table.Controls.Add(newRow);
    this.table.Controls.SetChildIndex(newRow, this.table.Controls.Count);
  }
}
于 2013-02-10T12:11:44.177 に答える
0

構文は正確ではないかもしれませんが、大まかに:

delegate void myedelegate(<mystuff>)
void UpdateSomething(<mystuff>)
if(this.invokerequired)
{
    mydelegate updater = new mydeleate(UpdateSomething);
    updater.invoke(new object[]{<mystuff>})
}
else
{
    //doupdate
}

また、必要なプラクティスの呼び出しに関する優れたガイドについては、http://www.codeproject.com/Articles/37642/Avoiding-InvokeRequiredを参照してください。

于 2013-02-10T12:12:58.677 に答える