我知道.NET lambda表達式可以捕獲外部變量。但是,我已經看到很多次變量被顯式地傳遞給lambda表達式作爲參數,並且.NET庫似乎也支持這個(例如ThreadPool.QueueUserWorkItem)。Lambda表達式,捕獲的變量和線程
我的問題是,這些捕獲的侷限性是什麼?如何在實際上在不同於它們創建的線程(例如ThreadPool.QueueUserWorkItem或Thread)上執行的lambda表達式或充當回調函數(即稍後調用)的lambda?
通常,我應該何時依賴捕獲的變量,以及何時使用顯式參數?例如:
public void DoStuff()
{
string message = GetMessage();
ThreadPool.QueueUserWorkItem(s => SendMessage(message)); // use captured variable
// -- OR --
ThreadPool.QueueUserWorkItem(s =>
{
string msg = (string)s;
SendMessage(msg);
}, message); // use explicit parameter
}
謝謝!
更新:修復了第二個ThreadPool.QueueUserWorkItem示例。
你說得對,我錯過了第二部分例子中的參數。據我所知,在實踐中,我使用哪一個並不重要,但是由於簡單性(和可讀性),您會推薦我使用捕獲的變量。非常感謝您的詳細解答! – ShdNx 2010-10-10 12:04:42