Я играю с 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
, чтобы потоки, ожидающие его, заканчивались? (Я так не думаю, но я подумал, что это стоит спросить.)
Просто пытаясь узнать, вот и все. :) И ваше предложение сработало. Это похоже на путь для этого простого примера. Благодаря! –
Нет проблем! Мы все учимся в один момент :) Я не думаю, что вы обычно используете эти механизмы сигнализации в потоках, которые никогда не заканчиваются. Я думаю, что более распространенный случай использования - когда у вас есть поток, который выполняет какую-то работу, но не может продолжаться до тех пор, пока что-то еще не произойдет в другом месте. Как только это произойдет, оно возобновляет и заканчивает работу. Решение Background Thread по-прежнему хорошо известно, это важный аспект Threads. Одна последняя вещь, созданная вручную Threads Forefront по умолчанию, а потоки ThreadPool - по умолчанию. – BFree
Я следовал за Джозефом Альбахари Threading в статье C#, и я хотел попробовать использовать 'AutoResetEvent'. Затем я искал практическую причину, чтобы использовать его, и нашел это от мистера Скита: http://stackoverflow.com/questions/7735809/autoresetevent-and-manualresetevent. Спасибо за советы. Каждый бит помогает ... –