Ok ...そう簡単です。私は実際にはすでにほとんどの部分でこれを動作させています。しかし、プログラムが実際には停止していなくても、プログラムが不一致に見える場合があります。プログラムは単にサービスを停止し、ある場所から別の場所にファイルをコピーした後、サービスを開始します。サービスはコピーされているファイルをロックしているため、停止する必要があります。サービスが完全に停止するのを待ってから続行してください。
internal void StopTheService()
{
Logger.Log("Stopping the service.");
lock (myLock) {
var sc = new ServiceController() { ServiceName = nameOfService, MachineName = nameOfServerWithService };
sc.Stop();
sc.WaitForStatus(ServiceControllerStatus.Stopped);
}
Logger.Log("Service stopped.");
}
internal void StartTheService()
{
Logger.Log("Starting the service.");
lock (myLock) {
var sc = new ServiceController() { ServiceName = nameOfService, MachineName = nameOfServerWithService };
sc.Start();
sc.WaitForStatus(ServiceControllerStatus.Running);
}
Logger.Log("Service Started.");
}
このコードは、ほとんどの部分は動作しますが、問題は、それは、サービスが停止していると考えて、次のステップに移行したときに、コピーが、それが失敗したということです。次のようなwhileループで停止/開始するのを待つことができます。
while(count<5){
sc.WaitForStatus(ServiceControllerStatus.Stopped);
count = count+1;
}
しかし、私はそれも失敗する可能性があると思います。私の質問は間違っているかもしれませんが、ネット上に見つからなかったものはすべて私の質問に正確に答えません。このコードを実行するアプリケーションは、マルチスレッド環境(したがってロック)です。失敗した後にアプリケーションを再実行すると、動作します。それが返すエラーは、別のファイルを開こうとすると得られる典型的な "別のプロセスで開くファイル"のエラーです。これは私がアクセスしているサービスとファイルを持つリモート環境であり、私はUACが問題ではないように管理者権限を持っていることに注意してください。
質問:どのようにしてサービスが停止または開始されてから続行するのが確実なのでしょうか?ほとんどすべてのソリューションに対応しています。質問を複製することに応答して
:これを離れて設定します
ことは、それは私がこの仕事を実行するためにアクセスしていますが、リモート・システムであるということです。重複した質問として記載されている質問は、遠隔のシナリオを特定したり表示したりするものではありません。しかし、私はそれをテストし、成功する必要があります私は答えとして投稿します。しかしそれまでは重複していません。
"サービスが停止して次のステップに移動したと思うと、失敗します。" - これをデバッグしましたか?私はこれを「サービス停止ですが、OSの種類のファイルを処理するのを忘れてしまった」と見ることができます。これは実際には回避できないかもしれない厄介なバグのように聞こえます。 – TomTom
@リチャード・バーカー私はこの正確な問題を抱えており、http://stackoverflow.com/a/1597244/60188はすべてうまく解決しました。 –
@AntonGogolevうわー、それは古いものです。私はまったく同じ質問名を入力したときに、Stackoverflowはそれを見つけられませんでした。 –