Я знаю, что .NET лямбда-выражения могут захватывать внешние переменные.
Однако я часто видел, как переменные явно передаются лямбда-выражению в качестве параметра, и библиотека .NET также поддерживает это (например, ThreadPool.QueueUserWorkItem).
Мой вопрос: каковы ограничения этих захватов? Как насчет лямбд, которые на самом деле выполняются в потоке, отличном от того, в котором они были созданы (например, ThreadPool.QueueUserWorkItem, или Thread), или в виде лямб, которые действуют как обратные вызовы (т.е. вызываются позже)
Как правило, когда мне следует полагаться на захваченные переменные и когда использовать явные параметры? Например:
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.