我在玩AutoResetEvent
和我的應用程序沒有結束,我想我知道爲什麼:線程仍在運行,因此該應用程序不會終止。通常,在Main()
中,按下一個鍵後,應用程序終止。但控制檯窗口不再關閉。我有一個簡單的控制檯應用程序:正確的方式來停止應用程序,而線程正在等待WaitOne()
private static EventWaitHandle waitHandle = new AutoResetEvent(false);
static void Main(string[] args)
{
AutoResetEventFun();
Console.WriteLine("Press any key to end.");
Console.ReadKey();
waitHandle.Close(); // This didn't cause the app to terminate.
waitHandle.Dispose(); // Nor did this.
}
private static void AutoResetEventFun()
{
// Start all of our threads.
new Thread(ThreadMethod1).Start();
new Thread(ThreadMethod2).Start();
new Thread(ThreadMethod3).Start();
new Thread(ThreadMethod4).Start();
while (Console.ReadKey().Key != ConsoleKey.X)
{
waitHandle.Set(); // Let one of our threads process.
}
}
// There are four of these methods. Only showing this one for brevity.
private static void ThreadMethod1()
{
Console.WriteLine("ThreadMethod1() waiting...");
while (true)
{
waitHandle.WaitOne();
Console.WriteLine("ThreadMethod1() continuing...");
}
}
什麼是正確的方式來終止此應用程序?我是否需要保留對每個線程的引用並在每個線程上調用Abort()
?有沒有辦法表示waitHandle
,以便等待它的線程終止? (我不這麼認爲,但我認爲這值得提問)。
只要努力學習,就是這樣。 :)你的建議工作。這似乎是這個簡單的例子的路要走。謝謝! –
沒問題!我們都在學習一點:)我不認爲你通常會在永不終止的線程中使用這些信號機制。我認爲一個更常見的用例是當你有一個線程做一些工作,但不能繼續下去,直到其他地方發生其他事情。一旦發生事情,它會恢復並完成其工作。後臺線程解決方案仍然很好知道,這是線程的一個重要方面。最後一件事,手動創建的線程默認爲Foreground,而ThreadPool線程默認爲後臺線程。 – BFree
我在C#文章中關注了Joseph Albahari的Threading,我想嘗試使用'AutoResetEvent'。然後我搜索了一個實際的理由來使用它,並從Skeet先生那裏找到了這個:http://stackoverflow.com/questions/7735809/autoresetevent-and-manualresetevent。感謝您的小費。每一位都有幫助... –