线程和lambda表达式

10 .net c# lambda multithreading threadpool

下面两段代码有什么区别?使用第二个问题会有任何问题吗?

场景1:

private void Log(Exception e)
{
    ThreadPool.QueueUserWorkItem(new WaitCallback(Log), e);
}

private void Log(object obj)
{
    Exception e = (Exception)obj;
    Logger.Log(e);
}
Run Code Online (Sandbox Code Playgroud)

情景2

private void Log(Exception e)
{
    ThreadPool.QueueUserWorkItem(
        (obj) => 
            {
                Logger.Log(e);
            });
}
Run Code Online (Sandbox Code Playgroud)

在方案2中,我没有将异常作为参数传递给ThreadPool.如何发生异常对象的线程编组?会有问题吗?这样做有什么限制?最大的优点是您可以非常轻松地传递任意数量的参数.

And*_*are 14

唯一的区别是,在场景二中,您正在关闭e变量,该变量有效地将堆栈变量e移动到移动到堆的自定义类型中,这样您就不会丢失它.

我认为这应该没问题.

编辑:至于性能,两种情况之间不应该有显着差异.在方案1中,您已经将异常传递stateQueueUserWorkItem内部将该异常引用移动到堆上的方法.唯一的开销是,当您使用闭包时,编译器会为您创建一个类型,并将任何捕获的变量存储为该类型的字段.