当孩子的内部线程发生某些事情时,从父母中删除子对象

时间:2013-08-27 21:33:53

标签: c# multithreading memory-management

假设我有ObjectAclassA),其中包含:

List<classB> bList;

现在让我们假设在每个objectB中都有一些正在运行的线程(无法从外部objectB访问它们),threadB1threadB2

现在,在此类列表的某个objectB中,threadB2会发现objectBRemove==true

当发生这种情况时,我想终止来自这个对象的所有线程并将其从bList中删除(我实际上想要销毁这个objectB)。

我以为我可以在objectB内举起一个活动并订阅一个objectA的方法来处理这样的事件:

public void onObjectBRemove(object sender, EventArgs e)
{
    bList.Remove((classB) sender);
}

objectB事件发生后调用此项时,应从列表中删除objectB。然后,垃圾收集器应该注意objectB变为未引用,从而删除它,同时终止所有内部线程。

这应该有效吗?这是解决手头问题的合理方法吗?

1 个答案:

答案 0 :(得分:3)

  

当在objectB的事件上升之后调用它时,这应该从列表中删除objectB。然后,垃圾收集器应该注意到objectB变为未引用并因此删除它,同时终止所有内部线程。

这将从列表中删除对象 - 但List<T>不是线程安全的,因此您需要同步(或线程安全集合,例如ConcurrentBag<T>)。

请注意,这不会终止正在运行的线程。如果要停止正在运行的操作,则应使用.NET's cooperative cancellation并将CancellationTokenSource设置为已取消状态,此时您的线程可以正常退出。