C # Использование мьютексов между двумя разными формами Windows для условного выполнения метода

#c# #winforms

#c# #winforms

Вопрос:

У меня есть два разных приложения Windows forms на C #, которые запускаются из разных программ. Предполагается, что одно из окон обновит папку с содержимым в фоновом режиме. Другая форма либо бездействует в меню, либо играет в игру, которая полагается на содержимое, загруженное в фоновом режиме.

Моя проблема возникает, когда пользователь играет в игру, в то время как содержимое обновляется в другой форме.

Я изучал возможность использования мьютексов для обмена данными между двумя формами, чтобы, когда пользователь находится в игре в основной форме, фоновая форма не обновляла никакого содержимого, пока пользователь не выйдет из игры.

Я никогда раньше не использовал мьютексы и ищу помощь в их настройке.

Это конструктор моей фоновой формы.

     /// <summary>
    /// Initialises an instance of the <see cref="GameReviewManager" /> class.
    /// </summary>
    public GameReviewManager()
    {
        _initialStartup = false;

        InitializeComponent();

        _launcher = new Process();
        _launcher.StartInfo.FileName = "GameReviewLauncher";
        _launcher.EnableRaisingEvents = true;
        _launcher.Exited  = LauncherExited;

        if (!GamesFolderEmpty())
        {
            _launcher.Start();
            _initialStartup = true;
        }
        else
        {
            textLabel.Text = "Copying content, please wait.";
        }
    }
  

Он отслеживает основную форму процесса.

Вот метод, который обновляет контекст во время выполнения фоновой формы, он вызывается из показанного события.

     /// <summary>
    /// Monitors the directory at path, copies any changes made.
    /// </summary>
    /// <param name="path">The path to monitor.</param>
    private void MonitorDirectory(string path)
    {
        //Now Create all of the directories
        foreach (string dirPath in Directory.GetDirectories(path, "*", SearchOption.AllDirectories))
        {
            Directory.CreateDirectory(dirPath.Replace(path, GamesDirectory));
        }

        //Copy all the files amp; Replaces any files with the same name
        foreach (string newPath in Directory.GetFiles(path, "*", SearchOption.AllDirectories))
        {
            if (newPath.Substring(newPath.Length - 4) != ".ini")
            {
                string destination = newPath.Replace(path, GamesDirectory);
                File.Copy(newPath, newPath.Replace(path, GamesDirectory), true);
                Console.WriteLine("File added: {0}", destination);

                if (!string.IsNullOrWhiteSpace(progressTextBox.Text))
                {
                    progressTextBox.AppendText("rn"   $"File added: {destination}");
                    progressTextBox.ScrollToCaret();
                }
                else
                {
                    progressTextBox.AppendText($"File added: {destination}");
                    progressTextBox.ScrollToCaret();
                }
            }
        }

        progressTextBox.AppendText("rnrn"   "Content copied successfully.");
        progressTextBox.ScrollToCaret();

        FileSystemWatcher fileSystemWatcher = new FileSystemWatcher();
        fileSystemWatcher.Path = path;
        fileSystemWatcher.Created  = FileSystemWatcherCreated;
        fileSystemWatcher.Renamed  = FileSystemWatcherRenamed;
        fileSystemWatcher.Deleted  = FileSystemWatcherDeleted;
        fileSystemWatcher.Changed  = FileSystemWatcherChanged;
        fileSystemWatcher.EnableRaisingEvents = true;
    }
  

Я не уверен, как реализовать мьютекс в этом коде, чтобы не разрешать обновлять содержимое, если выполняется процесс из конструктора.

Любая помощь была бы оценена. 🙂

Комментарии:

1. Публикую код для использования мьютексов. Держитесь крепче.

2. Не о мьютексе, а об одном предложении с проверкой расширения вашего файла: измените newPath.Substring(newPath.Length - 4) != ".ini") на new FileInfo(newPath).Extension == ".ini"

Ответ №1:

Программа 1

 public void DownloadForm1()
{
   using (var m = new Mutex(true, "SomeAwesomeName"))
   {
      m.WaitOne();

      try
      {
         // code to protect here
      }
      finally
      {
         m.ReleaseMutex();
      }
   }
}
  

Программа 2

 public void ProcessForm2()
{
   using (var m = new Mutex(true, "SomeAwesomeName"))
   {
      m.WaitOne();

      try
      {
         // code to protect here
      }
      finally
      {
         m.ReleaseMutex();
      }
   }
}