2013-02-10 75 views
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); 
} 

尽管这种方法工作得很好,我怀疑它的最好-practice做到这一点,因为

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

这种方式基本上是用于调用,而不是调用相同。

任何想法,我可以改善呢?

+0

如果你没关系使用PostSharp,我会推荐这[后](http://stackoverflow.com/questions/11183026/how-to-write-a-postsharp-invoke -aspect到简化-CRO SS-线程控制更新)。 – Matthias 2013-02-10 12:10:42

+0

我会将通用代码放在Action /委托中,并将其传递给Invoke,或者在else中调用它。 – kenny 2013-02-10 12:14:31

+0

我编辑了你的标题。请参阅:“[应该在其标题中包含”标签“](http://meta.stackexchange.com/questions/19190/)”,其中的共识是“不,他们不应该”。 – 2013-02-10 12:17:11

回答

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); 
    } 
} 
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了在调用所需的做法很好的指导