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中,您已经将异常传递state给QueueUserWorkItem内部将该异常引用移动到堆上的方法.唯一的开销是,当您使用闭包时,编译器会为您创建一个类型,并将任何捕获的变量存储为该类型的字段.
| 归档时间: |
|
| 查看次数: |
4193 次 |
| 最近记录: |