Ця стаття є дзеркальною статтею машинного перекладу, будь ласка, натисніть тут, щоб перейти до оригінальної статті.

Вид: 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 06: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