在线程等待WaitOne()时停止应用程序的正确方法

Bob*_*orn 1 c# multithreading autoresetevent event-wait-handle

我正在玩AutoResetEvent,我的应用程序没有结束,我想我知道原因:线程仍在运行,因此应用程序不会终止.通常,在Main()我按下一个键后,应用程序终止.但控制台窗口不再关闭.我有一个简单的控制台应用:

    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...");   
        }
    }
Run Code Online (Sandbox Code Playgroud)

什么是终止此应用程序的正确方法?我是否需要保留对每个线程的引用并调用每个线程Abort()?有没有办法发出信号,waitHandle以便等待它的线程终止?(我不这么认为,但我认为值得问.)

BFr*_*ree 7

虽然我不完全确定你想要完成什么,让这个应用程序终止的一种方法是制作所有线程后台线程:

private static void ThreadMethod1()
{ 
    Thread.CurrentThread.IsBackground = true;
    Console.WriteLine("ThreadMethod1() waiting...");

    while (true)
    {
        waitHandle.WaitOne();
        Console.WriteLine("ThreadMethod1() continuing...");   
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 没问题!我们都在学习一点:)我不认为你通常会在永不终止的线程中使用这些信令机制.我认为一个更常见的用例是当你有一个线程做一些工作,但在其他地方发生其他事情之前不能继续.一旦发生某些事情,它就会恢复并完成其工作.Back Thread解决方案仍然很好,它是Threads的一个重要方面.最后一点,默认情况下,手动创建的线程是Foreground,默认情况下ThreadPool线程是后台. (2认同)