我知道.NET Lambda表达式可以捕获外部变量。
不过,我经常看到变量作为参数明确传递给Lambda表达式,并且.NET库似乎也支持这种方式(例如ThreadPool.QueueUserWorkItem)。
我的问题是这些捕获的限制是什么?那么对于实际上在不同线程上执行的lambda(例如ThreadPool.QueueUserWorkItem或Thread),或者充当回调的lambda(即稍后调用的lambda),应该怎么办?
通常情况下,我应该依赖于捕获的变量,何时使用显式参数?例如:
我的问题是这些捕获的限制是什么?那么对于实际上在不同线程上执行的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示例的问题。