我可能会误解这个线程场景,但这就是我要问的原因。
在以下情况下会发生什么/可能会发生什么(假设是C#线程)?注意:此方案简化为核心问题,忽略了额外的功能。
我有两个对象a和b,它们分别是A和B类的实例; 'b'是'a'的成员。
'b'正在运行一个处理循环,还有一些其他活动在不断地做某事。有一次,'b'检测到一种情况,导致它向'a'发送一个事件。当'a'收到此事件时,它会执行以下代码:
void b_eventFoo()
{
b.UnhookEvents();//clears the delegate that truggered this event function
this.b = new B();
b.HookEvents(this);//connects the new b object to this A
}
旧的'B'对象会发生什么?原来的'b'仍在进行一些处理,触发事件的线程仍然可以执行。我不太了解线程,无法预测这种情况的结果。
甚至重要吗?
如果我要澄清任何事情,请告诉我。
答案 0 :(得分:2)
原始B仍然在运行,你将失去对它的引用。
答案 1 :(得分:2)
一开始,你有:
Thread1: [A1] -----field ----> [B1]
<--- event -----
你创建一个新的线程,在B1上运行一个循环;这里的关键是委托和实例方法(在使用过程中)本身具有对实例的引用(在IL术语中它是“arg0”);所以你有:
Thread1: [A1] ---- field ----> [B1]
<--- event ----- ^
Thread2: ------------------------^
然后取消该事件并取消该字段:
Thread1: [A1] ---- field ----> [nil]
Thread2: --------------------> [B1]
重新创建并重新考虑另一个实例:
Thread1: [A1] ---- field ----> [B2]
<--- event -----
Thread2: --------------------> [B1]
所以:你的线程继续针对[B1]进行处理,但不再影响[A1]
答案 2 :(得分:0)
旧B
仍在投放,但仍然引用A
。由于A
不再了解此B
,这可能是非常糟糕的情况。
如果可能的话,你应该尽量避免像这样的循环引用,特别是当这样的操作顺序可能发生时。如果A
使用B
而B
使用A
,为什么他们不是一个班级?他们相互紧密地联系在一起,他们都可以访问彼此的成员。