调试时防止控制台关闭

时间:2013-09-06 17:16:13

标签: c# timer

我的问题是控制台应该保持打开状态。当Console.ReadLine()等待输入时,计时器无法向控制台写入任何内容。如何在不使用Console.ReadLine(),Console.ReadKey()或system(“pause”)的情况下阻止控制台关闭?

这是我的代码:

namespace Closer {
    public static class Program {
        public static void Main () {
            // Define timer
            var t = new Windows.Forms.Timer() {
                Enabled = true,
                Interval = 30000
            };

            // Give timer the tick function
            t.Tick += (object tSender, EventArgs tE) => {
                // If it is half past eleven
                if (DateTime.Now.Hour.ToString() + DateTime.Now.Minute.ToString() == "2330") {
                    // Close all osu!.exe's --- works
                    foreach (Process p in Process.GetProcessesByName("osu!")) {
                        p.Kill();
                    }

                    // Write a msg
                    Console.WriteLine("Done!");
                }
            };

            // Prevent the console from closing --- Here's the problem
            Console.ReadLine();
        }
    }
}

3 个答案:

答案 0 :(得分:3)

您正在混淆两个问题。是的,.NET 4.5的早期版本错误地让Console.ReadLine()采取阻止线程写入控制台的锁定。这已得到修复,只需打开Windows Update即可获得服务版本。

真正的问题是你的Timer类选择。 System.Windows.Forms.Timer需要一个消息循环来触发Tick事件。您只能通过调用Application.Run()来获取消息循环。对于Console.ReadLine()顺便说一下非常合适的替代品,使用Application.ExitThread()来终止您的应用。

您应该在控制台模式应用程序中使用System.Threading.Timer或System.Timers.Timer。它们的回调是在线程池线程上触发的,因此不需要调度程序循环。

答案 1 :(得分:2)

你应该使用System.Timers.Timer,一切正常。

    static void Main()
    {
        // Define timer
        System.Timers.Timer t = new System.Timers.Timer()
        {
            Enabled = true,
            Interval = 1000
        };

        // Give timer the tick function
        t.Elapsed += (object tSender, System.Timers.ElapsedEventArgs tE) =>
        {
            Console.WriteLine("Done!");
        };


        Console.ReadLine();
    }

答案 2 :(得分:-2)

你可以试试这个:

Thread.CurrentThread.Join();

我知道这很愚蠢,但这可以满足您的需求。并且该过程永远不会终止(本身)你要手动杀死。