Unity C# - 当类被销毁时,无限循环线程是否终止?

问题描述 投票:1回答:1

我有一个游戏对象,它包含一个类A(扩展单行为),它包含(创建)一个类B(无单行为)。 这个类B产生了一个包含while(true)循环的线程,这个线程做了一些工作。

我的问题是...

当这个GameObject被disposeddestroyed时,我假设它里面包含的B类也被销毁了。当这个类B被销毁时,这个无限循环线程是否也被终止?

c# multithreading class unity3d
1个回答
0
投票

已经启动的线程,主要是运行到主线程结束。这是一个操作系统级别的后备,以避免没有自己的应用程序的僵尸线程。然而,这不是一个你应该依赖的后备机制。一个线程一旦启动,就应该被看作是一个非管理资源,所以应该有清理代码。尤其是Dispose模式。

有这样一个 奇妙的文章,如何做到这一点但我觉得需要解释一下。一般来说,你必须用Dispose模式区分两种情况。

  1. 你是在直接处理一个Unamanged资源。. 在这种情况下,你先写Finalizer。然后提供Dispose作为一种方便的方式来清理程序员决定的东西。
  2. 你正在处理或者可能正在处理一些实现IDisposeable的东西。 在这种情况下,你所实现的就是Dispose部分,并且仅仅是为了将调用级联到你所封装的Disposeable的东西。

95%的类只实现了IDisposeable,因为情况2。我们不知道是否真的有什么Disposeable,或者那只是抽象基类的一部分。

线程没有实现Dispose 我不知道为什么),所以你得到了一个罕见的情况1。Dispose和Finalizer通常也会被压缩成一个方法--通常是Dispose那个--因为它们的代码非常相似。Finalize和Dispose之间唯一真正的区别是级联行为。

  • 当Finalize时,你永远不会级联。Finalize是在这个实例和GC之间。
  • 当Disposing时,你总是级联(在可能的情况下)。大多数情况下,它只是为了允许级联。

我最后的建议是,既然你是在多线程下工作,你就必须注意不要吞下Exceptions。通常情况下,你必须写出非常糟糕的代码来吞噬Exceptions,但是在多任务处理的情况下,你必须用你的方式来解决以下问题 吞下任何。我找不到任何迹象表明Thread有一个内置的机制来持久化异常(我知道事实上Task有)。我只能给你两篇我经常链接的关于异常处理的文章。

© www.soinside.com 2019 - 2024. All rights reserved.