c# – 使用.NET ThreadPool.QueueUserWorkItem的匿名代理

c# – 使用.NET ThreadPool.QueueUserWorkItem的匿名代理,第1张

概述我打算发一个问题,但提前想出来并决定发布问题和答案 – 或者至少我的意见. 当使用匿名委托作为WaitCallback时,在foreach循环中调用ThreadPool.QueueUserWorkItem时,似乎将相同的一个foreach-value传递到每个线程. List< Thing > things = MyDb.GetTheThings();foreach( Thing t in Th 我打算发一个问题,但提前想出来并决定发布问题和答案 – 或者至少我的意见.

当使用匿名委托作为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详细讨论了该语言特性及其含义.

总结

以上是内存溢出为你收集整理的c# – 使用.NET ThreadPool.QueueUserWorkItem的匿名代理全部内容,希望文章能够帮你解决c# – 使用.NET ThreadPool.QueueUserWorkItem的匿名代理所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1248579.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-07
下一篇2022-06-07

发表评论

登录后才能评论

评论列表(0条)

    保存