我正在使用管理線程池來運行操作的類。它最初被編碼到採取行動(不帶參數)和我打電話這樣說:多線程和lambda變量範圍
void LoadTasks()
{
string param;
// some code loops and changes param
{
threadPool.EnqueueTask(() => SomeMethod(param));
}
}
由於線程運行一些被罰款,但偶爾帕拉姆變量是不是我所期待...它是一個「更新」的價值,而不是我打算髮送給該方法的東西。
將線程池更改爲接受Action<Object>
並調用時沒有使用lambda - 像threadPool.EnqueueTask(SomeMethod, param)
- 解決了我的問題。
我看到了很多關於C#lambda關於線程安全性的問題。例如,lambdas 的an accepted answer不太可能比您預期的線程安全。我正在尋找有關lambda/closures/scoping的其他問題和答案,令人困惑。所以我正在尋找一個lambda表達式和變量範圍的解釋,理想情況下與我的例子中的問題有關。
這個問題和我的答案可能對你有幫助:http://stackoverflow.com/questions/8898925/is-there-a-reason-for-cs-reuse-of-the-variable-in-a -foreach –