Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在应用程序以C结束之前,计时器不会启动#_C#_Multithreading_Timer - Fatal编程技术网

C# 在应用程序以C结束之前,计时器不会启动#

C# 在应用程序以C结束之前,计时器不会启动#,c#,multithreading,timer,C#,Multithreading,Timer,我在C#中有一个简单的控制台应用程序,它创建了一个计时器来向控制台写入文本。然后等待用户按键 如果用户在五秒钟之前按下一个键,那么应用程序将结束,计时器将永远不会启动。如果用户未按键,则计时器将按预期启动 为什么计时器创建的线程不能阻止应用程序终止?我应该如何确保即使用户按键,应用程序也能保持运行 static void Main(string[] args) { System.Timers.Timer timer = new System.Timers.Timer(50

我在C#中有一个简单的控制台应用程序,它创建了一个计时器来向控制台写入文本。然后等待用户按键

如果用户在五秒钟之前按下一个键,那么应用程序将结束,计时器将永远不会启动。如果用户未按键,则计时器将按预期启动

为什么计时器创建的线程不能阻止应用程序终止?我应该如何确保即使用户按键,应用程序也能保持运行

static void Main(string[] args)
    {
        System.Timers.Timer timer = new System.Timers.Timer(5000);
        timer.Interval = 5000; // 5 seconds
        timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
        timer.Enabled = true;
        timer.AutoReset = true;
        timer.Start();
        Console.ReadKey();
    }

    public static void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        Console.WriteLine("Timer Fired.");
    }

要使计时器消息始终写入,可以让主线程在一个上等待,一旦启动计时器,就会发出信号

    static ManualResetEvent timerFired = new ManualResetEvent(false);

    static void Main(string[] args)
    {
        System.Timers.Timer timer = new System.Timers.Timer(5000);
        timer.Interval = 5000; // 5 seconds
        timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
        timer.Enabled = true;
        timer.AutoReset = true;
        timer.Start();
        Console.ReadKey();

        // This call will return only after timerFired.Set() is
        // called.  So, if the user hits a key before the timer is
        // fired, this will block for a little bit, until the timer fires.  
        // Otherwise, it will return immediately
        timerFired.WaitOne();
    }

    public static void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        Console.WriteLine("Timer Fired.");
        timerFired.Set();
    }
至于另一个问题,为什么它不能阻止应用程序退出,我来试试。正在从后台线程调用计时器()。根据MSDN,后台线程不保持执行环境的运行。这里有一个电话


线程池线程是后台线程,MSDN Timer文档表明计时器是在线程池线程上启动的,因此应用程序不会等待它,因为它不是前台线程。

回答得好,只有线程池线程不是后台线程,任何CLR管理的线程(即
System.Threading.Thread的实例
)可以将其标记为背景或前景,而不管其实例是否被合并。@ BorisB。谢谢您的评论。让我们尝试澄清答案。当我们可以将线程池线程从后台更改为前台时,默认默认为背景线程安全,还是不确定?