12

特定の時間に継続的に実行して作業を実行するために必要なコンソール アプリケーションを開発しようとしています。

私の質問は、アプリケーションを存続させるための最良の方法またはプラクティスは何ですか?

私の考えは:終わりのないループ?スリープしてから必要に応じてルーチンにジャンプするタイマー (設定されたスリープ期間の後)?

アプリケーションを exe にコンパイルし、AlwaysUp を使用してサービスとして実行します。

よろしく..

ピーター

4

11 に答える 11

14

より良い解決策は、ジョブを実行して終了するコンソール アプリケーションを作成することです。その後、Windows タスク スケジューラを使用して定期的に実行できます。

于 2009-03-30T03:02:16.387 に答える
8

そもそもアプリをサービスとして構築してみませんか?

于 2009-03-30T02:58:32.587 に答える
5

これには実際にはサービスを使用する必要がありますが、とにかくこれを行う必要がある/したい場合は、 a を使用しManualResetEventてこれを行うことができます。

private ManualResetEvent Wait = new ManualResetEvent(false);

「開始」が完了し、ただ待ちたい場合は、次のようにします。

Wait.WaitOne();

停止して終了させたい場合は、次のようにします。

Wait.Set();
于 2015-12-04T23:33:05.147 に答える
3

System.Windows.Formsへの参照と呼び出しを追加してSystem.Windows.Forms.Application.Run()、標準のアプリケーション メッセージ ループを開始できます。 Ctrl-Cアプリを終了します。

別のオプションはConsole.ReadKey()、アプリを一時停止するために使用することです。お気に入りConsole.WriteLine("Press [ANY] key to quit..."); Console.ReadKey();

これは、イベントが発生するのを待っているだけのコンソール アプリで使用するものです。どちらの場合でも、アプリは引き続き実行され、トリガーされたイベント (タイマー、WCF、FileWatcher など) をキャッチします。

于 2013-03-04T22:26:27.277 に答える
3

不必要にプロセッサ時間を消費するループでスピンしたくないでしょう。

Windows を使用していると仮定すると、必要に応じて WaitForSingleObject() または WaitForMultipleObjects() または MsgWaitForMultipleObjects() の呼び出しで終了しないループが必要です。次に、名前付きイベントなど、目を覚ます同期オブジェクトを用意します。

ここでWin32 同期のドキュメントを参照してください。あなたのプログラムが何をする必要があるかについて詳しく説明していただければ、より具体的なアドバイスを提供できるでしょう。

于 2009-03-30T03:01:12.050 に答える
2

継続的に実行されるコードはデーモンと呼ばれ、要求を実行する方法を概説する記事が ここにあります。簡単なサービスの書き方の例ここ.

于 2009-03-30T03:00:35.377 に答える
2

プログラムが継続的に実行される場合は、目的のイベントが発生するまで (たとえば、XX 秒が経過するまで) スリープする必要があります。while {} ループでスピンすると、CPU 時間が無駄になります。

プログラムが常にマシン上で実行される場合は、プログラムをサービスにして、マシンで自動的に開始および停止することを検討する必要があります。

于 2009-03-30T03:02:05.807 に答える
1

スレッドをスリープ状態にする: System.Threading.Thread.Sleep(10000);

キーが押されるのを待っています: Console.WriteLine("Press any key to continue..."); Console.Read();

于 2011-10-25T10:17:27.003 に答える
1

デスクトップ アプリケーションを構築する場合は、システム トレイで実行する必要があります。この意志

  1. ユーザーが誤ってアプリケーションを閉じないようにする
  2. アプリケーションがユーザーの画面を乱雑にしないようにします

サーバー アプリケーションを構築する場合は、Windows サービスを記述します。この意志

  1. 管理者が誤ってアプリケーションを閉じないようにする
  2. アプリケーションを実行するためにサーバーに誰かがコンソールにログインする必要がなくなります

主に IT プロフェッショナルである私は、Windows サービスではなくコンソール アプリとして実行されるサード パーティ製アプリケーションが購入されないようにするために多大な努力を払ったと思います。これにより多くの作業が発生し、重大なサポートの問題とセキュリティ ホールが生じます。

于 2009-03-30T04:01:20.893 に答える
1

まあ、いつかはやめるべきだと思いますよね?

機能するスレッドを生成し、コンソール アプリとしても実行できるようにする場合は、Console.ReadLine() にメイン スレッド ブロックを配置します。

本当にメイン スレッドを永久に一時停止したい場合は、起動しない ManualResetEvent をブロックするだけです。

ただし、可能であれば、サービスの使用を検討してください。

于 2009-03-30T03:02:01.550 に答える