c# - 线程和 lambda 表达式

标签 c# .net multithreading lambda 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);
}

场景 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/

相关文章:

C# 垃圾收集器、线程和编译器/抖动优化

c# - 从大字符串中删除数字时出现性能问题

c# - SystemMediaTransportControl GetForCurrentView() 在桌面设备系列 (UWP C#

c# - 任务异常处理是否应该快速失败?

c# - 为什么 C# 编译器不自动推断此代码中的类型?

c# - Nevron Open Vision for .NET - 需要反馈

c# - 获取完整类属性 "Tree"名称作为字符串

c# - 在 native C++ 项目中导入 C# dll 库

java - 即使在其他线程中启动,帧也会卡住

c++ - 正在等待条件变量、正在加入的线程会发生什么情况?