每次我从除了创建元素之外的线程更新程序视图时,我都会使用:
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);
与调用和不调用基本相同。
我有什么想法可以改善它吗?
答案 0 :(得分: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);
}
}
答案 1 :(得分: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以获取有关调用所需做法的良好指南