假設你有一個類可以啓動一些後臺線程:這個類可以有一個啓動這些線程的方法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
實例被覆蓋:如果在線程尚未完成時執行覆蓋,會發生什麼情況?
不一定是壞事 –