2016-11-07 5 views
0

を開始する必要がない場合は、私はプロセスがすでにGetProcessByNameを使用して実行されているかどうかのコードは、私がチェックしています私のexeファイルをチェックする方法は、バックグラウンドプロセスで実行されています。

if (Process.GetProcessesByName("my_process").Length > 0) 
{ 
    writelog("Started uploading files"); 
    upload_file(); 
    writelog("Finished uploading files"); 
} 

ごとに1秒

私のコードを実行しますしているWindowsサービスを作成しました。 それはStarted uploading files

は、だから私のログファイルは、私は必要なもの

Started uploading files 
Started uploading files 
Started uploading files 
Finished uploading files 
Finished uploading files 
Finished uploading files 

になりますので、1秒ごとの後にログファイルがエントリを取得して動作していないこと

Started uploading files 
Finished uploading files 
Started uploading files 
Finished uploading files 
Started uploading files 
Finished uploading files 

すなわちです。最初のサイクルを終えてサービスはプロセスに入るべきではありません。 これを実現する方法はありますか

+0

ロックを使用できるif(Process.GetProcessesByName( "my_process")。Length> 0) { //ここに } –

答えて

0

これにはMutexを使用できます。この問題を回避するには、次のように使用してください。

private static object _sync = new object(); 
..... 

if (Process.GetProcessesByName("my_process").Length > 0) 
{ 
    lock(_sync)//mutex here, so, only one thread will be able to launch this code. 
    { 
     if (Process.GetProcessesByName("my_process").Length > 0) 
     { 
      writelog("Started uploading files"); 
      upload_file(); 
      writelog("Finished uploading files"); 
     } 
    } 
} 

ここでダブルチェックはパフォーマンス用です。必要に応じてアウトチェックを削除することができます。

関連する問題