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

あなたは2つの問題を混同しています。はい、.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 を使用する必要があります。それらのコールバックはスレッドプール スレッドで起動されるため、ディスパッチャー ループは必要ありません。

于 2013-09-07T14:46:05.490 に答える
-2

これを試すことができます:

Thread.CurrentThread.Join();

私はこれがばかげていることを知っていますが、これはあなたが必要とすることをします. また、手動で強制終了する必要があるプロセスが (それ自体で) 終了することはありません。

于 2013-09-06T17:27:01.140 に答える