特定の時間に継続的に実行して作業を実行するために必要なコンソール アプリケーションを開発しようとしています。
私の質問は、アプリケーションを存続させるための最良の方法またはプラクティスは何ですか?
私の考えは:終わりのないループ?スリープしてから必要に応じてルーチンにジャンプするタイマー (設定されたスリープ期間の後)?
アプリケーションを exe にコンパイルし、AlwaysUp を使用してサービスとして実行します。
よろしく..
ピーター
特定の時間に継続的に実行して作業を実行するために必要なコンソール アプリケーションを開発しようとしています。
私の質問は、アプリケーションを存続させるための最良の方法またはプラクティスは何ですか?
私の考えは:終わりのないループ?スリープしてから必要に応じてルーチンにジャンプするタイマー (設定されたスリープ期間の後)?
アプリケーションを exe にコンパイルし、AlwaysUp を使用してサービスとして実行します。
よろしく..
ピーター
より良い解決策は、ジョブを実行して終了するコンソール アプリケーションを作成することです。その後、Windows タスク スケジューラを使用して定期的に実行できます。
そもそもアプリをサービスとして構築してみませんか?
これには実際にはサービスを使用する必要がありますが、とにかくこれを行う必要がある/したい場合は、 a を使用しManualResetEvent
てこれを行うことができます。
private ManualResetEvent Wait = new ManualResetEvent(false);
「開始」が完了し、ただ待ちたい場合は、次のようにします。
Wait.WaitOne();
停止して終了させたい場合は、次のようにします。
Wait.Set();
System.Windows.Forms
への参照と呼び出しを追加してSystem.Windows.Forms.Application.Run()
、標準のアプリケーション メッセージ ループを開始できます。 Ctrl-Cアプリを終了します。
別のオプションはConsole.ReadKey()
、アプリを一時停止するために使用することです。お気に入りConsole.WriteLine("Press [ANY] key to quit..."); Console.ReadKey();
これは、イベントが発生するのを待っているだけのコンソール アプリで使用するものです。どちらの場合でも、アプリは引き続き実行され、トリガーされたイベント (タイマー、WCF、FileWatcher など) をキャッチします。
不必要にプロセッサ時間を消費するループでスピンしたくないでしょう。
Windows を使用していると仮定すると、必要に応じて WaitForSingleObject() または WaitForMultipleObjects() または MsgWaitForMultipleObjects() の呼び出しで終了しないループが必要です。次に、名前付きイベントなど、目を覚ます同期オブジェクトを用意します。
ここでWin32 同期のドキュメントを参照してください。あなたのプログラムが何をする必要があるかについて詳しく説明していただければ、より具体的なアドバイスを提供できるでしょう。
プログラムが継続的に実行される場合は、目的のイベントが発生するまで (たとえば、XX 秒が経過するまで) スリープする必要があります。while {} ループでスピンすると、CPU 時間が無駄になります。
プログラムが常にマシン上で実行される場合は、プログラムをサービスにして、マシンで自動的に開始および停止することを検討する必要があります。
スレッドをスリープ状態にする: System.Threading.Thread.Sleep(10000);
キーが押されるのを待っています: Console.WriteLine("Press any key to continue..."); Console.Read();
デスクトップ アプリケーションを構築する場合は、システム トレイで実行する必要があります。この意志
サーバー アプリケーションを構築する場合は、Windows サービスを記述します。この意志
主に IT プロフェッショナルである私は、Windows サービスではなくコンソール アプリとして実行されるサード パーティ製アプリケーションが購入されないようにするために多大な努力を払ったと思います。これにより多くの作業が発生し、重大なサポートの問題とセキュリティ ホールが生じます。
まあ、いつかはやめるべきだと思いますよね?
機能するスレッドを生成し、コンソール アプリとしても実行できるようにする場合は、Console.ReadLine() にメイン スレッド ブロックを配置します。
本当にメイン スレッドを永久に一時停止したい場合は、起動しない ManualResetEvent をブロックするだけです。
ただし、可能であれば、サービスの使用を検討してください。