假设我有ObjectA
(属于classA
),其中包含:
List<classB> bList;
现在,我们假设每个
objectB
中都有几个正在运行的线程(无法从objectB
外部访问它们),threadB1
和threadB2
。现在,在此类列表的某个
objectB
中,threadB2
发现该objectBRemove==true
。发生这种情况时,我想终止该对象的所有线程并将其从
bList
中删除(我实际上是想破坏此objectB
)。我以为我可以在
objectB
内引发一个事件,并将objectA
的方法订阅到该事件:public void onObjectBRemove(object sender, EventArgs e)
{
bList.Remove((classB) sender);
}
在
objectB
事件上升后调用此函数时,应从列表中删除objectB
。然后,垃圾收集器应注意objectB
变为未引用,因此将其删除,并终止所有内部线程。这应该工作吗?这是解决当前问题的合理方法吗?
最佳答案
这会将对象从列表中删除-但List<T>
并非线程安全的,因此您将需要同步(或线程安全的集合,例如ConcurrentBag<T>
)。
请注意,这不会终止正在运行的线程。如果要停止正在运行的操作,则应使用.NET's cooperative cancellation并将CancellationTokenSource
设置为已取消状态,此时您的线程可以正常退出。
关于c# - 当 child 的内部线程发生问题时,从父对象中删除子对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18475859/