下面两段代码有什么区别?使用第二个会有任何问题吗?
场景 1:
private void Log(Exception e)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(Log), e);
}
private void Log(object obj)
{
Exception e = (Exception)obj;
Logger.Log(e);
}
场景 2
private void Log(Exception e)
{
ThreadPool.QueueUserWorkItem(
(obj) =>
{
Logger.Log(e);
});
}
在场景 2 中,我没有将异常作为参数传递给 ThreadPool。异常对象的线程编码是如何发生的?会不会有什么问题?如果有的话,这样做有什么限制?最大的优势是您可以非常轻松地传入任意数量的参数。
最佳答案
唯一的区别是,在场景二中,您关闭了 e
变量,这有效地将堆栈变量 e
移动到一个自定义类型中,该类型被移动到堆中,因此你不会失去它。
我认为这应该可以正常工作。
编辑:至于性能,两种情况之间不应该有显着差异。在场景 1 中,您已经将异常作为 state
传递给 QueueUserWorkItem
方法,该方法在内部将该异常引用移动到堆上。唯一的开销是,当您使用闭包时,编译器会为您创建一个类型并将任何捕获的变量存储为该类型的字段。
关于c# - 线程和 lambda 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/840782/