#c# #multithreading #process #mutex #multitasking
#c# #многопоточность #процесс #мьютекс #многозадачность
Вопрос:
У меня есть несколько экземпляров консольного приложения c #, запущенного одновременно. Пока один выполняет определенную задачу, никто другой не должен выполнять ту же задачу. Поэтому в идеале я хотел бы иметь в памяти некоторый общедоступный bool, который все экземпляры могут проверять перед началом выполнения этой задачи. Если bool имеет значение true, им нужно подождать. Процесс, выполняющий задачу, установит bool в false по завершении.
Я знаю, что «мьютекс» существует, но я не уверен, как его реализовать или это то, что мне нужно для этого. Какой процесс создает эту переменную в памяти? Как другие узнают, где в памяти его найти?
Любая помощь будет с благодарностью принята.
Ответ №1:
Один из способов сделать это — использовать мьютекс, поскольку вы делаете это в разных процессах, вам нужно будет использовать именованный мьютекс:
public class App
{
static Mutex SingleInstanceMutex = new Mutex(false, "MyApp{2CA3B0BE-26B7-46d3-9CF3-234B9EFE8681}");
public static void Main()
{
while(true)
{
if (SingleInstanceMutex.WaitOne(TimeSpan.Zero, true));
{
Console.WriteLine("Only one process can be doing this at a time")
SingleInstanceMutex.ReleaseMutex();
}
}
}
}
Мне нравится использовать идентификатор guid как часть имени, чтобы предотвратить любую возможность столкновения именования с другим приложением.
Комментарии:
1. Спасибо за вашу помощь, но Филипп опубликовал первым, поэтому я принял его ответ. 1, хотя
Ответ №2:
Вам необходимо использовать общесистемный мьютекс, который вы можете создать, указав имя. Ознакомьтесь с примером для страницы конструктора MSDN.