对象运行线程A被线程B销毁时会发生什么?

时间:2009-11-24 19:10:50

标签: c# multithreading thread-safety

我可能会误解这个线程场景,但这就是我要问的原因。

在以下情况下会发生什么/可能会发生什么(假设是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'仍在进行一些处理,触发事件的线程仍然可以执行。我不太了解线程,无法预测这种情况的结果。

甚至重要吗?

如果我要澄清任何事情,请告诉我。

3 个答案:

答案 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使用BB使用A,为什么他们不是一个班级?他们相互紧密地联系在一起,他们都可以访问彼此的成员。