2010-07-16 64 views
1

在使用.NET异步委托首次,我很惊讶地凭经验发现在非同步方法改变一个实例成员的值(例如一个int)时(在新的线程中运行),在原始线程中运行的实例成员的值也被更改。.NET异步委托和对象实例成员

我认为创建一个新的线程时,实例成员值从原来的线程复制,但然后从原始隔离。

有人能帮助我更好地了解什么是幕后回事?在我的研究中,大多数书籍/文章都提到静态变量,但不包括实例变量。谢谢!

回答

1

异步委托不做任何复制,也不会让你的域本地线程。他们所做的只是将委托排队,以便在线程池中的线程中运行。无论这个代表如何影响一切会影响的事物。这很容易意味着它所做的更改不是线程安全的。

+0

可以存在于user394007的关于包含委托对象的实例,并且其执行线程的实例之间的差异部分的混淆... TLS是每线程唯一的,并作为线程的一部分,而不是天生管理代表的一部分。 – 2010-07-16 15:17:58

+0

(将user394007更改为Dave :))因此,听起来像运行异步委托的主线程和主线程都引用同一个对象实例 - 因此关于线程安全的警告 - 正确吗? – 2010-07-16 19:29:19

+0

正确。通常,您希望每个线程在需要使用共享资源的时间段内锁定共享资源。 – 2010-07-16 19:54:05