2009-03-30 14 views
11

私は、コンソールアプリケーションを開発しています。これは、特定の時間に作業を継続して実行する必要があります。C#コンソールアプリケーション - 実行し続ける

私の質問は、アプリケーションを有効に保つための最良の方法または方法は何ですか?

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

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

よろしく..

ピーター

+0

あなたが非常に多くの種類の返答を得た理由は、このことが何をするのかについての情報をあまり多く与えていないということです。より多くの情報があれば、今まで提示されているオプションのいくつかを絞り込むことができます。 – Cheeso

答えて

8

なぜあなたが最初の場所でのサービスとしてアプリケーションを構築しませんか?継続的に実行されます

+0

WIndowsはサービスを利用する必要があります。これは、誰があなたをこの人に魅了したかわからない場合に最もよくサポートされるモデルです。 – ojblass

2

コードはデーモンと呼ばれ、あなたが求めるものを行う方法を概説記事 hereがあります。それでは簡単なサービスを書く方法の例を紹介しますhere

+0

はい、私はサービスを考えたが、ファイルを処理し、構成ファイルで指定された特定の時間に動作するように格納されたファイルから構成情報を読み取る必要があるため、私のニーズを満たすとは思わない。 –

3

プロセッサ時間を無駄に消費するループをスピンアップさせたくないかもしれません。

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

Win32同期化のドキュメントhereを参照してください。あなたのプログラムが何をしなければならないかについてもっと詳しく説明するならば、もっと具体的なアドバイスを提供するかもしれません。

+0

こんにちは、 このアップデートをお寄せいただき、ありがとうございます。これをコンソールアプリケーションとして選択した理由は、手動でいつでも手動で実行できるということです。アプリケーションは、設定ファイルを読み込み、設定ファイルに格納されている情報から特定の時刻にファイルの読み取り/処理を実行します。 –

+0

証明書ディレクトリにファイルがない場合は、警告メールを送信する必要があります。ファイルが存在する場合は、エラーを探して読んだり読み込んだりする必要があり、エラーがあれば警告メールも送信する必要があります。 –

1

私はある時点でそれを止めるべきであると確信しています。

コンソールアプリケーションとしても実行できるようにするには、動作するスレッドを生成し、Console.ReadLine()にメインスレッドブロックを作成します。

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

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

2

プログラムが継続的に実行される場合は、目的のイベントが発生するまで(たとえば、XX秒が経過するまで)スリープ状態にする必要があります。あなたがちょうどwhile {}ループで回転するなら、CPU時間を吸うでしょう。

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

13

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

+2

絶対に同意してください! Jon Galloway氏はブログの記事を書いて、タスクの代わりにサービスを作ることで間違っていると私に確信しました:http://weblogs.asp.net/jgalloway/archive/2005/10/24/428303.aspx –

+0

私は、サービスはユーザーの資格情報の点でより柔軟性があると思います。 – ojblass

+0

少なくとも、私が見た限り、スケジュールされたタスクが実行される資格情報を設定できます。あなたは仕事ではできないサービスで何ができますか? –

1

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

  1. 誤ったアプリケーション
  2. を閉じてからユーザーを続けるあなたは、Windowsサービスを作成したいと思うでしょうサーバーアプリケーションを構築する場合はユーザーの画面

を乱雑からのアプリケーションを保管してください。これは

  1. アプリケーションが主にある者として

内で実行されるために、誰かがコンソールにログインしたのは、サーバーの必要性を排除し、誤ってアプリケーション

  • を閉じてから、管理者をしてくださいますITプロ私は、Windowsアプリケーションではなくコンソールアプリケーションとして実行されるサードパーティのアプリケーションを購入することから多くの努力を払っていると言います。それは私たちのために多くの仕事を生み出し、重要なサポート問題とセキュリティ上の問題を引き起こします。

  • 1

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

    キーが押されるのを待っています: Console.WriteLine( "続けるには任意のキーを押してください..."); Console.Read();

    +0

    スレッドスリープでは、ソフトウェアの実行速度が遅くなり、使用しないでください。コンソールアプリケーションにはAutoResetSignalを使用するか、常時実行する必要がある場合はサービスを作成する必要があります。 – ppumkin

    3

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

    もう1つの方法は、Console.ReadKey()を使用してアプリを一時停止することです。 Like Console.WriteLine("Press [ANY] key to quit..."); Console.ReadKey();

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

    2

    あなたが/必要とにかくこれを実行したい場合は、あなたが本当に、このためのサービスを使用する必要がありますが、あなたはこれを行うにはManualResetEventを使用することができます:あなたが完了したら、[開始 'と

    private ManualResetEvent Wait = new ManualResetEvent(false); 
    

    待つだけにしたい、あなたがやるだろう:

    Wait.WaitOne(); 
    

    をあなたが停止し、それが終了させたい場合は、あなたがして行うことができます。

    Wait.Set(); 
    
    関連する問題