2017-09-19 11 views
0

過去には私にはよく働いているこのdotnet coreでは、アプリケーションのコピーを1つしか実行しないようにするにはどうすればよいですか?

private static bool AlreadyRunning() 
{ 
    var processes = Process.GetProcesses(); 
    var currentProc = Process.GetCurrentProcess(); 
    logger.Info($"Current proccess: {currentProc.ProcessName}"); 
    foreach (var process in processes) 
    { 
     if (currentProc.ProcessName == process.ProcessName && currentProc.Id != process.Id) 
     { 
      logger.Info($"Another instance of this process is already running: {process.Id}"); 
      return true; 
     } 
    } 
    return false; 
} 

のようなものを行っています。新しいdotnetコアの世界では、プロセス名はすべてdotnetなので、一度に実行できるのはdotnetなので!私が欲しいものではない:D

ドットネットでこれを行う理想的な方法はありますか?私はmutexの提案を見ていますが、Windowsマシン以外のシステムで起こっている可能性のある短所やエラー状態を理解しているかどうかはわかりません。

答えて

2

.NET Coreでは、グローバル名前付きmutexがサポートされるようになりました。スレッドのプロセス共有堅牢な再帰ミューテックスをサポートするシステムで

  • 、彼らは他のシステムでは
  • を使用される、ファイルロックが使用されている:PR descriptionから、それは、その機能を追加しました。残念ながら、ファイルロックはブロッキング待機コールにタイムアウトを持たず、必要なプロパティでタイムアウト待ちの他の同期オブジェクトを見つけられなかったので、ポーリングはタイムアウト待ちに行われます。

はまた、便利なノートが使用されなければならないミューテックス名程度Named mutex not supported on Unix問題、であり:デフォルトで

、名前はセッションスコープとセッションを持っている(各ターミナルのUnix上でよりきめ細かされていますそれ自身のセッションを取得する)。名前に引用符を除いた「グローバル」接頭辞を追加してみてください。

0

最後に私はミューテックスを使用しました。それは大丈夫です。

私はちょうどそれを削除したので、私が使用しているコアのバージョンは、セキュリティ設定のもののいくつかを持っていないようですここ What is a good pattern for using a Global Mutex in C#?

からコードをつかみました。私はそれがうまくいくと確信しています。 (は3つのパラメータしか取らない)

private static void Main(string[] args) 
    { 
     LogManager.Configuration = new XmlLoggingConfiguration("nlog.config"); 
     logger = LogManager.GetLogger("console"); 
     logger.Info("Trying to start"); 

     const string mutexId = @"Global\{{guid-guid-guid-guid-guid}}"; 

     bool createdNew; 
     using (var mutex = new Mutex(false, mutexId, out createdNew)) 
     { 
      var hasHandle = false; 
      try 
      { 
       try 
       { 
        hasHandle = mutex.WaitOne(5000, false); 
        if (!hasHandle) 
        { 
         logger.Error("Timeout waiting for exclusive access"); 
         throw new TimeoutException("Timeout waiting for exclusive access"); 
        } 
       } 
       catch (AbandonedMutexException) 
       { 
        hasHandle = true; 
       } 

       // Perform your work here. 
       PerformWorkHere(); 
      } 
      finally 
      { 
       if (hasHandle) 
       { 
        mutex.ReleaseMutex(); 
       } 
      } 
     } 
    } 
関連する問題