многопоточность и объем лямбда-переменных
Я использую класс, который управляет пулом потоков для запуска действий. Первоначально он был закодирован для выполнения действия (без параметров), и я назвал его так:
void LoadTasks()
{
string param;
// some code loops and changes param
{
threadPool.EnqueueTask(() => SomeMethod(param));
}
}
Поскольку потоки работали, некоторые были в порядке, но иногда переменная param была не такой, как я ожидал ... это было "новее" значение, а не то, что я намеревался отправить в метод.
Изменение пула потоков для принятияAction
и звонит без лямбды - вот такthreadPool.EnqueueTask(SomeMethod, param)
- обошёл мою проблему.
Я вижу довольно много вопросов о C # lambdas о безопасности потоков. Например,принятый ответ лямбдыгораздо менее вероятно, чтобы быть потокобезопасным, чем вы ожидаете. Я'Я нахожу другие вопросы и ответы о лямбдах / затворах / ограничениях, чтобы сбить с толку. Поэтому я ищу объяснение лямбды и переменной области, в идеале относящиеся к проблеме в моем примере.