使用 C# 关闭 Unity 中的线程

本文关键字:线程 Unity 关闭 使用 | 更新日期: 2023-09-27 18:32:58

我想确保当我的应用程序退出时,任何和所有打开的线程都被关闭。但是,当我尝试这样做时,我收到错误,告诉我没有我正在尝试执行的操作的引用对象,即使它们都在同一个类中。

有人可以帮我吗?

启动/打开线程:

Thread listen_thread;
TcpListener tcp_listener;
Thread clientThread;

// Use this for initialization
void Start () 
{
    IPAddress ip_addy = IPAddress.Parse(ip_address);
    tcp_listener = new TcpListener(ip_addy, port);
    listen_thread = new Thread(new ThreadStart(ListenForClients));
    listen_thread.Start();

    Debug.Log("start thread");
}

然后我尝试关闭它们:

void OnApplicationQuit()
{
    try
    {
        clientThread.Abort();
        tcp_listener.Stop();
        listen_thread.Abort();
    }
    catch(Exception e)
    {
        Debug.Log(e.Message);
    }
}

我做错了什么?线程打开并按照它们应该做的事情做得很好,但由于某种原因我无法关闭它们。

使用 C# 关闭 Unity 中的线程

你不应该强迫一个线程Abort,在SO和网络上有很多关于这个主题的好答案,例如:

  • 将线程放入其自己的进程中。当您希望它停止时,请终止该进程。
  • 如何在 .NET 中停止线程(以及为什么 Thread.Abort 是邪恶的)
  • 您无需取消线程。
  • msdn on THread.Abort().请参阅备注部分。

相反,您应该实现一个 cancalation 模式,例如通过 TaskBackgroundWorker 类。在这种情况下,你基本上会说:"停止或破坏你所做的任何事情,然后退出方法"。您还可以推出自己的实现:查询易失值布尔值或使用事件句柄,但可能坚持使用已有的解决方案。此答案中的更多信息。