使用 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);
}
}
我做错了什么?线程打开并按照它们应该做的事情做得很好,但由于某种原因我无法关闭它们。
你不应该强迫一个线程Abort
,在SO和网络上有很多关于这个主题的好答案,例如:
- 将线程放入其自己的进程中。当您希望它停止时,请终止该进程。
- 如何在 .NET 中停止线程(以及为什么 Thread.Abort 是邪恶的)
- 您无需取消线程。
- msdn on THread.Abort().请参阅备注部分。
相反,您应该实现一个 cancalation 模式,例如通过 Task
或 BackgroundWorker
类。在这种情况下,你基本上会说:"停止或破坏你所做的任何事情,然后退出方法"。您还可以推出自己的实现:查询易失值布尔值或使用事件句柄,但可能坚持使用已有的解决方案。此答案中的更多信息。