2013-02-10 112 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了在調用所需的做法很好的指導