2013-09-27 43 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