24*7*365 で実行する必要がある C# 4.0 Windows コンソール アプリケーションがあります。(このアプリケーションを監視する Windows サービスがあり、何らかの理由で終了した場合は開始します)。このコンソール アプリケーションの起動には、リソースを消費する複雑なアクティビティが含まれているため、コンソール アプリケーションが頻繁に再起動されないようにする必要があります。コンソール アプリケーションには 3 つの System.Timers.Timer インスタンスがあり、タイマーが経過すると何らかのアクティビティを実行します (間隔はそれぞれ 10 秒、15 秒、2 時間です)。コンソール アプリケーションが終了するのを防ぎ、それを維持する正しい方法は何でしょうか? 誰か提案してください!
3 に答える
コメントで述べたことから、コンソール アプリケーションを使用する唯一の理由は、デバッグ メッセージを読むことができるようにするためです。この答えはその仮定から外れます。
コンソール アプリは、やりたいことを行うには十分な信頼性がありません。アプリが起動しない、または複数回起動するという状況に遭遇することが多くあります (誰もログインしていない場合はどうしますか? あなたは何をしますか?複数の人がログインしている場合は?)
最善の方法は、この集中的な操作をサービスとして記述し、コンソールに出力する診断情報をイベント ログまたはデバッガーに出力することです。
アプリケーション イベント ログにメッセージを書き込む場合は、情報を に書き込むだけですthis.EventLog.WriteEntry(message)
。これにより、サービスのアプリケーション イベント ログに情報イベントが生成されます。重大度を警告またはエラーに上げたい場合は、他のオーバーロードを使用するだけです。
アプリケーション以外のログ (独自のログなど) に書き込みたい場合は、サービスのインストーラーに必要なソース/ログを作成させる必要があります (これについてサポートが必要な場合は、新しい質問をしてください)。次にAutoLog
、サービスを false に設定し、新しいログを指す独自のイベント ログ インスタンスを作成します。
問題を診断しているときにのみ表示されるログが必要な場合、最も簡単な解決策は、Console.WriteLine(message)
ステートメントを に変更することDebugger.Log(1, "DebugLogging", message + Environment.NewLine)
です。これにより、サービスの実行中にサービスに接続すると、「デバッグ」出力ウィンドウにメッセージが表示されます (サービスに接続してデバッガーを実行する方法を知っていますか?それ)。Debug.WriteLine(message)
組み込みのリリース モードで診断を行う予定がない場合を除き、使用はお勧めしません。これはDebug.WriteLine
、 属性を持っているためです[Conditional("DEBUG")]
。これにより、コンパイル時に DEBUG フラグが設定されていて、Release にそのフラグが設定されていない場合にのみ関数が実行されます。
より堅牢なソリューションが必要な場合は、log4netの使用方法を学習することをお勧めします。Log4net を使用すると、上記のすべてに加えて、さらに多くのことを実行できます。たとえば、設定ファイルを介してイベント ログに書き込まれる量を制御できます (新しい設定でログを開始するためにプログラムを再起動する必要さえありません。保存を実行すると検出されます)。
このようにして、詳細なログ メッセージをコードに入れることができますが、XML 構成ファイルの 1 つの設定を変更することで、必要な場合にのみ有効にすることができます。
上位 2 つの提案のいずれかの設定または log4net の設定について質問がある場合は、これらのトピックに関する新しい質問を自由に開始してください。
Console.ReadLine() を使用して、コンソールを有効に保つことができます。しかし、おそらく Windows サービスが必要です。
while (Console.ReadLine() != "I really want to stop this application") { }
または似たようなものですか?
同様のアプリケーション (Minecraft など) を考えると、次のようなループが発生します。
string command;
Console.Write("> ");
while ((command = Console.ReadLine()).ToUpper() != "STOP")
{
// Do something else based on the command
...
Console.Write("> ");
}