#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();
}
}
}