我正在編寫GUI應用程序一段時間,而且我總是使用MethodInvoker + lambda函數來執行跨線程訪問。使用MethodInvoker而無需調用
從例子中我發現,我總是看到這樣的東西:
1版
if (InvokeRequired)
{
Invoke(new MethodInvoker(() =>
{
Label1.Text = "Foobar";
});
}
else
{
Label1.Text = "Foobar";
}
然而這會導致代碼的重複 - >大壞蛋給我。
那麼這有什麼問題呢?
2版
MethodInvoker updateText = new MethodInvoker(() =>
{
Label1.Text = "Foobar";
});
if (InvokeRequired)
{
Invoke(updateText);
}
else
{
updateText();
}
現在我的功能在一個可變捆紮並在適當的時候與調用或作爲函數指針調用它。版本2是否更糟?或者,我是不好的做法,使用匿名函數呢?
不錯,認爲我有2個問題:-)不知道更短的Lambda選項。另外,我認爲擴展方法更加優雅。它使我能夠更強調我在做什麼(InvokeIfRequired)。這有必要把第二個參數給Invoke?至少'Form'有一個arg超載? – Nebula 2012-08-14 08:02:31
@Nebula:不,看起來你是對的。我首先查看了更一般的'ISynchronizeInvoke'版本。將編輯這個案例。 – 2012-08-14 08:10:54
好的,謝謝。我實際上剛剛測試過這種方法,我對此非常滿意。它使很好的乾淨的代碼。我添加了一個'control.Isdisposed'和'control.Disposing'後衛來使它的製作值得,再次感謝! – Nebula 2012-08-14 08:17:13