2

我的问题是控制台应该保持打开状态。在 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();
        }
    }
}
4

3 回答 3

3

你把两个问题混为一谈。是的,.NET 4.5 的早期版本犯了一个错误,即让 Console.ReadLine() 获取阻止线程写入控制台的锁。已修复,只需打开 Windows 更新即可获得服务版本。

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

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

于 2013-09-07T14:46:05.490 回答
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();
    }
于 2013-09-06T18:16:26.577 回答
-2

你可以试试这个:

Thread.CurrentThread.Join();

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

于 2013-09-06T17:27:01.140 回答