c# – 使用.NET ThreadPool.QueueUserWorkItem的匿名代理
发布时间:2020-12-15 08:20:53 所属栏目:百科 来源:网络整理
导读:我打算发一个问题,但提前想出来并决定发布问题和答案 – 或者至少我的意见. 当使用匿名委托作为WaitCallback时,在foreach循环中调用ThreadPool.QueueUserWorkItem时,似乎将相同的一个foreach-value传递到每个线程. List Thing things = MyDb.GetTheThings();
我打算发一个问题,但提前想出来并决定发布问题和答案 – 或者至少我的意见.
当使用匿名委托作为WaitCallback时,在foreach循环中调用ThreadPool.QueueUserWorkItem时,似乎将相同的一个foreach-value传递到每个线程. List< Thing > things = MyDb.GetTheThings(); foreach( Thing t in Things) { localLogger.DebugFormat( "About to queue thing [{0}].",t.Id ); ThreadPool.QueueUserWorkItem( delegate() { try { WorkWithOneThing( t ); } finally { Cleanup(); localLogger.DebugFormat("Thing [{0}] has been queued and run by the delegate.",t.Id ); } }); } 对于事物中的16个Thing实例的集合,我观察到传递给WorkWithOneThing的每个’Thing’对应于’things’列表中的最后一个项目. 我怀疑这是因为委托正在访问’t’外部变量.请注意,我还尝试将Thing作为参数传递给匿名委托,但行为仍然不正确. 当我重新考虑代码以使用命名的WaitCallback方法并将Thing’t’传递给方法时,瞧……事物的第一个实例被正确地传递给了WorkWithOneThing. 我想是平行学的一课.我还想象Parallel.For系列解决了这个问题,但是这个库不是我们的选择. 希望这能节省一些时间. 霍华德霍夫曼 解决方法
这是正确的,并描述了C#如何捕获闭包内的变量.这不是关于并行性的直接问题,而是关于匿名方法和lambda表达式的问题.
This question详细讨论了该语言特性及其含义. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- React Native Android Fetch在连接到本地API时失败
- 学习使用SQLite(版本3.7.4)(中D)
- c# – 无法从我的Windows Phone 8.1应用程序中的ListView拖
- C怎么能打印到stderr?
- Ruby类继承:如何防止公共方法在子类中被覆盖
- 修改使用powershell迭代子属性的XML父属性
- jQuery插件ajaxfileupload.js实现上传文件
- 【React源码解读】react-ref && forward-ref
- c# – Asp.Net MVC 4 API:在IE8中下载docx失败
- ERROR: current transaction is aborted, commands ignored