2010-07-16 29 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