這是對只有這樣,才能做到這一點,但我會做兩個修改:
1)使用MethodInvoker,這樣你就可以省去Func或者Action的操作,但是繼續使用遞歸,這樣你就不會複製代碼。
2)向invoke塊添加一個返回值,這樣就沒有else塊。我寧願添加額外的行,而不是額外的縮進。
private void SetText(string text)
{
if (textBox1.InvokeRequired)
{
this.Invoke((MethodInvoker) delegate { SetText(text); });
return;
}
this.textBox1.Text = text;
}
關於第二個想法,你可以有個實用方法需要一個動作做檢查,和實際的邏輯將永遠是拉姆達內。
private static void InvokeIfRequired(bool required, Action action) {
// NOTE if there is an interface which contains InvokeRequired
// then use that instead of passing the bool directly.
// I just don't remember off the top of my head
if (required) {
this.Invoke((MethodInvoker) delegate { action(); });
return;
}
action();
}
private void SetText(string text)
{
InvokeIfRequired(textBox1.InvokeRequired,() => {
this.textBox1.Text = text;
});
}