システムエラー、odbc接続、または不足しているファイルエラーが発生したときに、プログラムで一時停止したいWindowsサービスアプリケーションを作成しています。誰かがこれを行う方法を知っているかどうか疑問に思っていましたか? Windowsサービスアプリケーションは、odbc接続とデータレアを使用してMS AccessデータベースとOracleテーブルに接続します。そのため、私はこれらのエラーを処理する可能性が高いエラーがあります。 /それらが発生したとき。プログラムでWindowsサービスアプリケーションで一時停止を作成する方法
答えて
試しましたか?
System.Threading.Thread.Sleep(1000); // sleep for 1 second
1000〜1000倍の時間を調整します(ただし、秒単位でスリープ状態にします)。
実際には "ユーザーが処理する"ことはできません。 – user2864740
ServiceController service = new ServiceController(serviceName);
TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutValue);
service.Pause(); //or whatever you want here.
sevice.WaitForStatus(ServiceControllerStatus.Paused, timeout);
...その後
再起動する、あなたはあなたが望む任意の状態のためにこれを行うことができます
service.Continue();
sevice.WaitForStatus(ServiceControllerStatus.Running, timeout);
を除いて同じことを行います。 SeviceControllerを使ってmsdnのドキュメントをチェックしてください。返される最初の結果になります。
また、サービスのOnPauseイベントとOnContinueイベントを処理する必要があります。
私はこれが_another_サービスを制御していると思います。サービスを止めるのはどうですか? – ZoolWay
サービス自体を停止することができます。このコードをあなたのサービスに入れてください。もちろん、それ自体を開始することはできませんが、サービスを最も確実に停止することができます。 –
この設計では、例外が発生したときにサービスが一時停止する可能性があります。 GUIユーザーは、準備ができたらボタンを押してサービスを続けることができます。 –
サービスがデータをチェックするループを継続していると仮定すると、外部ソースにpause/continueコマンドのチェックを追加します。このソースは、MSMQやデータベーステーブルなどのメッセージキューにすることができます。
私のサービスでは、継続的にコマンドのテーブルをチェックし、そのステータスを別のテーブルに報告することで、このように実装しました。開始コマンドを受け取ると、別のスレッドで処理ループを起動します。 stopコマンドは、スレッドが正常に終了するように通知します。サービスコアは決して動作を停止しません。
ユーザーは、別のアプリケーションを介して、サービスのステータスと送信コマンドを表示できるUIを操作します。アプリケーションはデータベースを介して制御を行うので、サービスが実行されているのと同じマシンで実行する必要はありません。
Windowsサービスは通常、UIなしで実行され、ユーザーとのやり取りはありません。サービスを一時停止してユーザーとのやりとりを待つことは、避けたい設計上のパターンではありません。より良い解決策は、エラーのためのある種の通知メカニズムを持つことです。イベントログと同じくらいシンプルなもの、またはサーバーイベントをリッスンするためのMSMQ pub/subパターンとして洗練されたものその後、通知を中心にUIを作成し、サービスのユーザーに悪影響を及ぼすことはありません。 – SRM
私は同意します。これはおそらく良いデザインではありません。しかし、あなたがそれをしなければならない場合、何らかの理由で、私は以下のように投稿することができます。 –
サービスにはUIがないので、あなたの質問には本当に答えることはできません。どのようにユーザーと対話しているのか説明することができれば(おそらく、サービスと通信する標準のデスクトップアプリケーションで)、その質問はより理にかなっています。 –