c# - 线程构造函数中显式委托(delegate)和方法组的区别

标签 c# multithreading delegates

<分区>

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

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

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

最佳答案

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

//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);

在第一个中,您创建一个委托(delegate)来关闭(或捕获)someObject 变量。当线程调用您的委托(delegate)时,它将评估变量指向哪个对象,并对其调用 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,因为该变量已被提前求值。

关于c# - 线程构造函数中显式委托(delegate)和方法组的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24806194/

相关文章:

C# 线程安全调用动态创建的控件

c# - 积分类型推广不一致

c# - 使用反射以 IList<T> 形式检索 NHibernate.Collections.Generic.PersistentGenericBag

python - 在单独的线程中扭曲传输。

ios - “MBProgressHUD 需要在主线程上访问。” - swift 3

c# - 将扩展方法组转换为具有泛型类型的委托(delegate)

C# App.config 与设置文件

c# - 使用文件中的 html 启动默认浏览器,然后跳转到特定 anchor

c++ - std::atomic 和 std::mutex 的相对性能

delegates - ImageMagick 不会将 Ghostscipt 显示为委托(delegate)