2013-09-27 42 views
1

我想确保当我的应用程序退出任何和所有打开的线程都关闭。然而,当我尝试这样做时,我得到了错误,告诉我没有任何参考对象用于我正在尝试做的事情,即使它们都在同一个类中。在C中关闭线程与C#

有人可以帮我吗?

启动/打开线程:

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); 
    } 
} 

我在做什么错?线程打开并做他们想要的事情,但由于某种原因,我无法关闭它们。

+0

我的测试(在Windows 7 64位上使用Unity 5.2)表明,thread.Abort在Unity中不起作用,除非被中止的线程在某个时刻休眠。如果您的ListenForClients方法在其主循环中包含一个Thread.Sleep(0),那么Abort应该可以工作。 (虽然你不会得到一个ThreadAbortException,这是另一个bug ...)。 – yoyo

回答

2

你不应该强迫一个线程Abort,有很多很好的答案对SO和网络其他地方关于这个主题,如:

相反,你应该通过TaskBackgroundWorker类实现cancalation模式,例如。在这种情况下,你基本上说:“停止或打破你所做的任何事情,只需退出方法”。您也可以推出自己的实现:查询volatile bool或使用事件句柄,但可能坚持已有的解决方案。更多的信息在this answer