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 回答