【问题标题】:Difference between explicit delegate and method group in a thread constructor [duplicate]线程构造函数中显式委托和方法组之间的区别[重复]
【发布时间】:2014-07-17 14:23:20
【问题描述】:

我测试了以下几行代码(当然不是同时测试),据我所知,它们达到了相同的结果。作为一个谨慎的人,我可以想象他们做什么/如何做事情之间存在差异,但由于缺乏适当的观察样本,我对此一无所知。

Thread whee = new Thread((ThreadStart)delegate { someObject.Start(); });
Thread whoo = new Thread(someObject.Start);
Thread whaa = new Thread(() => { someObject.Start(); });

如果有的话,上面的区别是什么?这些信息是否可能在几乎一目了然的某处可用,而我由于混淆而错过了它?!

【问题讨论】:

    标签: c# multithreading delegates


    【解决方案1】:

    第一次和第三次调用是完全相同的。关于另外两个:

    //Thread whee = new Thread((ThreadStart)delegate { someObject.Start(); });
    //or, using a lambda expression, 
    Thread whee = new Thread(() => someObject.Start());
    
    Thread whoo = new Thread(someObject.Start);
    

    在第一个中,您创建一个关闭(或捕获)someObject 变量的委托。当线程调用您的委托时,它将评估变量指向的对象,并在其上调用Start

    在第二个中,someObject 被热切地评估。

    Thread whee = new Thread(() => someObject.Start());
    Thread whoo = new Thread(someObject.Start);
    
    someObject = someOtherObject;
    
    whee.Start();
    whoo.Start();
    

    如果在启动线程之前将新对象分配给 someObject 变量,您会注意到:

    • 第一个线程在 someOtherObject 上调用 Start,因为闭包变量是惰性求值的。
    • 第二个线程在 someObject 指向的原始实例上调用 Start,因为该变量已被提前评估。

    【讨论】:

      【解决方案2】:

      在您的代码之后和启动线程之前设置someObject = null;,以便您自己查看。

      您的样本实际上是获取对象与创建可以在未来某个时间获取该对象的方法之间的区别。在这种情况下,代码仅与“那个对象”相同,someObject 永远不会改变。

      【讨论】:

      • 最好看简短的解释,或者像评论一样添加这个,因为这是一个建议,基本上......
      猜你喜欢
      • 1970-01-01
      • 2015-02-24
      • 2013-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-15
      • 2015-06-05
      相关资源
      最近更新 更多