Информация об изменениях

Сообщение Re[3]: Возможно ли синхронизовать процессы используя имя исп от 15.02.2022 15:04

Изменено 15.02.2022 15:28 alexander_r

Re[3]: Возможно ли синхронизовать процессы используя имя исп
Здравствуйте, MaLS, Вы писали:

MLS>Здравствуйте, alexander_r, Вы писали:


_>>может быть у обоих процессов и они оба завершатся, или наоборот, не успеют попасть в список процессов и оба откроются, вручную скорее всего это не воспроизвести, но программно вполне возможно


MLS>Вот это как раз и нужно обосновать.


MLS>P.S.

MLS>В программирование это как раз самое запарное доказывать, что кто-то был неправ.
MLS>Конечно сдаётся программу As Is, но от этого As Is заказчик уже беситься.

тест запускаем несколько процессов с синхронизацией через GetProcessesByName(..), при этом у меня стабильно воспроизводится ситуация, когда условие (Process.GetProcessesByName(procName).Length > 1) во всех процессах и в итоге не ничего открывается, теоретически может случится и запуск двух процессов, но с меньшей вероятностью
        static void Main(string[] args)
        {
            var procName = Process.GetCurrentProcess().ProcessName;
            if (args != null && args.Length > 0)
            {
                Parallel.For(0, 5, new Action<int>(i =>
                {
                    Process.Start(procName + ".exe");
                }));
            }

            if (Process.GetProcessesByName(procName).Length > 1)
            {
                Console.WriteLine("ALREADY RUNNING");
                return;
            }

            Console.WriteLine("RUN");
            Console.ReadKey();

        }


синхронизация через mutex работает всегда
        static void Main(string[] args)
        {
            var procName = Process.GetCurrentProcess().ProcessName;
            if (args != null && args.Length > 0)
            {
                Parallel.For(0, 5, new Action<int>(i =>
                {
                    Process.Start(procName + ".exe");
                }));
                return;
            }

            bool createdNew = false;
            Mutex mutex = null;
            try
            {
                mutex = new Mutex(true, procName, out createdNew);
                if (!createdNew)
                {
                    Console.WriteLine("ALREADY RUNNING");
                    return;
                }


                Console.WriteLine("RUN");
                Console.ReadKey();
            }
            finally
            {
                if (mutex != null)
                {
                    if (createdNew)
                    {
                        mutex.ReleaseMutex();
                    }
                    mutex.Dispose();
                }
            }
        }
Re[3]: Возможно ли синхронизовать процессы используя имя исп
Здравствуйте, MaLS, Вы писали:

MLS>Здравствуйте, alexander_r, Вы писали:


_>>может быть у обоих процессов и они оба завершатся, или наоборот, не успеют попасть в список процессов и оба откроются, вручную скорее всего это не воспроизвести, но программно вполне возможно


MLS>Вот это как раз и нужно обосновать.


MLS>P.S.

MLS>В программирование это как раз самое запарное доказывать, что кто-то был неправ.
MLS>Конечно сдаётся программу As Is, но от этого As Is заказчик уже беситься.

тест запускаем несколько процессов с синхронизацией через GetProcessesByName(..), при этом у меня стабильно воспроизводится ситуация, когда условие (Process.GetProcessesByName(procName).Length > 1) во всех процессах и в итоге ничего не открывается, теоретически может случится и запуск двух процессов, но с меньшей вероятностью
        static void Main(string[] args)
        {
            var procName = Process.GetCurrentProcess().ProcessName;
            if (args != null && args.Length > 0)
            {
                Parallel.For(0, 5, new Action<int>(i =>
                {
                    Process.Start(procName + ".exe");
                }));
            }

            if (Process.GetProcessesByName(procName).Length > 1)
            {
                Console.WriteLine("ALREADY RUNNING");
                return;
            }

            Console.WriteLine("RUN");
            Console.ReadKey();

        }


синхронизация через mutex работает всегда
        static void Main(string[] args)
        {
            var procName = Process.GetCurrentProcess().ProcessName;
            if (args != null && args.Length > 0)
            {
                Parallel.For(0, 5, new Action<int>(i =>
                {
                    Process.Start(procName + ".exe");
                }));
                return;
            }

            bool createdNew = false;
            Mutex mutex = null;
            try
            {
                mutex = new Mutex(true, procName, out createdNew);
                if (!createdNew)
                {
                    Console.WriteLine("ALREADY RUNNING");
                    return;
                }


                Console.WriteLine("RUN");
                Console.ReadKey();
            }
            finally
            {
                if (mutex != null)
                {
                    if (createdNew)
                    {
                        mutex.ReleaseMutex();
                    }
                    mutex.Dispose();
                }
            }
        }