長期実行プログラムをプログラムで監視する方法


11

私が現在持っているものは、この擬似コードで要約することができます:

public static void Main(string[] args)
{
    var listOfObjects = Database.GetObjectsToUploadToOnlineService();
    Parallel.ForEach(Upload)
}

private static void Upload(MyUploadObject obj)
{
    //Build object (takes a few milliseconds)
    //Format to JSON (takes a few more milliseconds)
    //Upload (can take up to a max of 10 minutes)
    //Wait for a response (can take up to a max of 10 minutes)
    //Save response to our database (takes a few milliseconds)
}

このプログラムは、スケジュールされたタスクとしてサーバーにセットアップされています。私たちはプログラムを所有しており、私たちはそれでやりたいことができます。私の質問は、自動監視チェックの作成に関するブログに由来しています(リンクは手元にありません)。

だから私は考えました:世界で別の「監視」プログラムを起動できるように、どのようにプログラムを変更できますか?または、この変更をコンソールプログラムから、非表示のWPFプログラムに変更する必要がありますか?

全体的に、ネットワーク上でプログラムの進行状況を確認するプログラムをコンピューターで実行できるようにしたいので、その状態を確認するためにサーバーにRDPする必要はありません(ただし、世界の終わりになる)。

全体として、次のようなウィンドウが表示されると思います:これまでのxのyの処理、次の項目が処理されています。テーブルなどに項目をリストし、「アップロード中」または「応答待ち」のように言ってもらいます。気が狂ったら、失敗したアイテムの列を並べることもできます(ただし、それは余分なことです)。

私の心はイベントに傾いていますが、実行中のプログラムをサブスクライブおよびサブスクライブ解除できるプログラムをどのように実行するかはわかりません。これも可能ですか?


(10分間続く)アップロード/応答操作内の進行状況を監視しますか、または「Parallel.ForEach」ループ内で行われたアップロードの数を知りたいですか?
Doc Brown

@DocBrown編集を参照してください。(最後の2つの段落)
ロバートスナイダー

1
あなたが望むものは、おそらく単純なUDP受信プログラムであるように思えます。ネットワーク上にステータスパケットをドロップできます。ステータスパケットを受信するものが何もない場合、被害はありません。
ロバートハーヴェイ

回答:


7

必要なのは、プログラムを相互に結び付けないプログラム間で通信する方法です。これを行うにはいくつかの方法があります。タスクにファイルを書き込み、ファイルからの読み取りを監視し、WCFを介してタスクを使用可能にして、モニターが変更を「ポーリング」し、ネットワークを使用するようにすることができます...

車輪の再発明を避けるために、log4netロギングターゲットを見てください。このようなものを実装する場合は、おそらくlog4netを使用してUDPまたはTelnetにログを記録し、反対側のモニターをそれに接続します。log4netは、アクティブなモニターがないときに例外をスローしないなど、すべてを処理します。


私たちはすでにlog4netをよく使用しているので、この答えに行くと思います。log4netがこれを行うことができる手がかりがありませんでした!ありがとう
ロバートスナイダー

9

あなたのコメントから、利用可能なクライアント/サーバーデータベースがあり、アップローダーはすでに接続と書き込みアクセスを持っていると思いますか?その後、おそらく「監視」または「ステータス」テーブルをデータベースに追加し、アップローダーが進捗をレポートできるようにするのがおそらく最も簡単でしょう(各「興味深い」ステップ、おそらく上記の5つのステップを記録します)。

ステータスを表示するには、GUIで2番目のプログラムを作成します。このプログラムは、データベースに接続してステータスを表示します(たとえば、1分間隔でポーリングする)。そこからデータベースに接続できると仮定して、ローカルデスクトップでそのプログラムを実行できます。

もちろん、ステータステーブルへの書き込みがデータベーストランザクションに干渉する場合は、別の接続を使用できます。また、MSQMのようなメッセージキューメカニズムを利用することもできますが、単純なケースではこれは大規模なソリューションになる可能性があります。


+1これは、シンプルに保ち、複雑すぎないものを過度に複雑にしないための最良のアプローチです。
トーマスストリンガー

3

@JDTの答えに基づいて、これを行う一般的な方法は、メッセージをメッセージキューに書き込むことです。アプリケーションで重要なことが発生するたびに、メッセージが書き込まれ、メッセージキューに送信されます。通常、メッセージの形式はXMLなどです。キューライターです。

監視アプリケーションは、キューを読み取り(キューリーダー)、メッセージを選択し、それらを保存して、メッセージと以前のメッセージまたは状態を分析して処理します。条件が満たされると、監視アプリケーションは潜在的な問題を示すアラートを生成します。

これにより、アプリケーションはメッセージの送信のみを行うため、アプリケーション自体の監視から切り離されます。現在のメッセージに基づいて、何か良いことや悪いことが起こったことを判断するのは監視アプリケーション次第です。キューを使用するのは、メッセージを損失なく保存するための優れた手段を提供するためです。

実行中のアプリケーションのインスタンスが複数ある場合は、メッセージングを集中化する必要があります。インスタンスが1つしかない場合は、Windowsイベントログやファイルなどの他のストアを使用するだけで十分です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.