Эта статья является зеркальной статьёй машинного перевода, пожалуйста, нажмите здесь, чтобы перейти к оригиналу.

Вид: 22992|Ответ: 2

[Источник] Подробное объяснение нескольких способов решения задачи программы на C#, которая позволяет выполнять только один экземпляр

[Скопировать ссылку]
Опубликовано 08.12.2016 13:11:13 | | |

Метод 1:
Используйте переменные мьютекса потока. Определите mutex-переменные, чтобы определить, работает ли экземпляр.
Измените функцию Main() в файле program.cs на следующий код:




Примечание: в программе оператор System.Threading.Mutex run = new System.Threading.Mutex(true, "single_test", out runone); для создания mutex-переменной выполните, где "single_test" — имя mutex, и при возврате этого метода, если создан локальный mutex или заданная система именований, булево значение runone является истинным; False, если указанный mutexe системы именования уже существует. Именованные мьютексы действуют по всей системе.
Метод 2: Используйте способ оценки процесса: перед запуском программы мы определяем, есть ли в процессе процесс с таким же названием, и текущая позиция тоже соответствует тому же процессу. Примените класс Process в пространстве имён System.Diagnostics на C# для его реализации, основной код выглядит следующим образом:
1. Добавить функцию в файл program.cs следующим образом:




2. Измените функцию Main () на следующий код:




Метод 3: Глобальный атомарный метод: перед созданием программы сначала проверьте глобальную атомарную таблицу, чтобы увидеть, есть ли конкретный атом A (добавленный при создании), и прекратите его создание при появлении, что указывает на запуск программы экземпляра; Если её нет, запустите программу и хотите добавить конкретный атом A в глобальную атомарную таблицу; При выходе из программы не забудьте освободить конкретный атом A, иначе он не будет освобождён, пока компьютер не будет выключен. Реализация на C# выглядит следующим образом:
1. Объявить функциональный интерфейс WinAPI

[System.Runtime.InteropServices.DllImport("kernel32.dll")]
публичный статический внешний UInt32 GlobalAddAtom (строка lpString); Добавлять атомы
[System.Runtime.InteropServices.DllImport("kernel32.dll")]
публичный статический внешний UInt32 GlobalFindAtom(строка lpString); Найти атомы
[System.Runtime.InteropServices.DllImport("kernel32.dll")]
публичный статический внешний UInt32 GlobalDeleteAtom(UInt32 nAtom); Удалить атомы
2. Модифицировать функцию Main() следующим образом:




3. Добавить следующий код в событие FormClosed:
GlobalDeleteAtom(GlobalFindAtom("jiaao_test")); Удалить атомное «jiaao_test»
--------------------------------------*-------*--------*-----------------------------------------------
Вышеописанное — основная общая идея создания взаимоисключающей программы, и лично я считаю, что первый метод — самый простой.




Предыдущий:Разница между Directory.GetCurrentDirectory и Application.StartupPath
Следующий:Разница между профилем клиента .Net Framework4 и .Net Framework4.0
Опубликовано 10.07.2017 6:31:21 |
Спасибо, что поделились
 Хозяин| Опубликовано 23.07.2024 14:21:04 |
Программы C# позволяют выполнять правильный код только одному экземпляру
https://www.itsvse.com/thread-3391-1-1.html
Отказ:
Всё программное обеспечение, программные материалы или статьи, публикуемые Code Farmer Network, предназначены исключительно для учебных и исследовательских целей; Вышеуказанный контент не должен использоваться в коммерческих или незаконных целях, иначе пользователи несут все последствия. Информация на этом сайте взята из Интернета, и споры по авторским правам не имеют отношения к этому сайту. Вы должны полностью удалить вышеуказанный контент с компьютера в течение 24 часов после загрузки. Если вам нравится программа, пожалуйста, поддержите подлинное программное обеспечение, купите регистрацию и получите лучшие подлинные услуги. Если есть нарушение, пожалуйста, свяжитесь с нами по электронной почте.

Mail To:help@itsvse.com