2012-09-18 28 views
3

假設你有一個類可以啓動一些後臺線程:這個類可以有一個啓動這些線程的方法Run(),以及一個可以正確停止它們的方法。其中一些後臺線程可能已經手動創建,其他的可能由Timer管理,當調用上述Run()方法時會激活其他線程。如果在線程尚未完成時線程對象被覆蓋會發生什麼?

public void Run() 
{ 
    m_ShutdownRequested = false; // shutdown flag disabled 

    m_WorkerThread = new Thread(Work) { IsBackground = true }; 
    m_WorkerThread.Start(); 
    // ... 
} 

public void Stop() 
{ 
    lock (m_LockInput) 
    { 
     m_ShutdownRequested = true; // shutdown flag enabled 
     Monitor.Pulse(m_LockInput); 
    } 
    m_WorkerThread.Join(m_ShutdownTimeout); 
} 

假設當用戶點擊UI上的運行按鈕Run()方法被調用。同樣,當用戶單擊UI上的Stop按鈕時,將調用Stop()方法。應該如何實現這些方法才能通過UI調用?它們是否應該是異步的?如果是的話,如何處理一些線程無法停止的可能性?

假設執行Stop()方法後,有些線程沒有停止。此時,如果用戶再次單擊運行按鈕,該類的實例將有一些線程尚未停止。但是,啓動Run()方法時,先前的m_WorkerThread實例被覆蓋:如果在線程尚未完成時執行覆蓋,會發生什麼情況?

回答

2

不會覆蓋線程,您只需創建一個變量的新實例並分配它。正在運行的線程將繼續運行,但由於您不再提及它,因此您將無法回到該線程。線程退出後,GC可能會清理線程實例,或者它可能不會。

3

線程一路順風,不受影響。另一方面,你卻失去了解決問題的方法。

+0

不一定是壞事

相關問題