Thread.Suspend було застаріло. Будь ласка, використовуйте інші класи в System.Threading, такі як Monitor, Mutex, Event і Semaphore, для синхронізації потоків або захисту ресурсів. Вхід за гіперпосиланням видно. Thread.Resume було застаріло. Будь ласка, використовуйте інші класи в System.Threading, такі як Monitor, Mutex, Event і Semaphore, для синхронізації потоків або захисту ресурсів. Вхід за гіперпосиланням видно. Якщо тред хоче призупинити або продовжити, я вже використовував два методи — Suspend і Resume, і використовую ці два способи для роботи з потоком, що насправді проблематично, і тоді мені це було байдуже, тож давайте сьогодні використаємо це і вивчимо!
У чому проблема використання двох вищезазначених методів для призупинення та продовження потоків?
Наприклад, якщо ми викликаємо метод Suspend, щоб призупинити потік, а потім одразу викликати метод Resume, щоб продовжити призупинений потік, тоді може виникнути проблема.
Оскільки після виклику методу Suspend для припинення потоку поток може не бути припинений одразу, тут потрібен час обробки, у цей момент ви одразу викликаєте метод Resume, щоб продовжити призупинений потік, і програма одразу зависне!
Пояснення Microsoft таке:
Не використовуйте методи Suspend та Resume для синхронізації активності потоків. Чи є спосіб дізнатися, що таке код, коли ви призупиняєте виконання потоку? Якщо ви тримаєте блокування під час оцінки привілеїв безпеки, інші потоки у вашому призупиненому потоці в AppDomain можуть бути заблоковані. Якщо ви призупиняєте інші потоки в AppDomain під час виконання конструктора класу, спроби використання класу блокуються. Глухі кути можуть легко виникнути.
// Зведення: Продовжуйте призупинений обхід. // Аномалія: T:System.Threading.ThreadStateException: Тред не запущений, не мертвий або не перебуває в очікуваному стані. // T:System.Security.SecurityException: Абонент не має відповідного System.Security.Permissions.SecurityPermission. [Застаріло("Thread.Resume було застаріло. Будь ласка, використовуйте інші класи в System.Threading, такі як Monitor, Mutex, Event і Semaphore, для синхронізації потоків або захисту ресурсів. Вхід за гіперпосиланням видно.", неправда)] [БезпекаБезпекаКритична] публічне недійсне резюме(); Як вирішити цю проблему?
Клас ManualResetEvent
Повідомте один або кілька потоків очікування, що сталася подія. Такі типи не можуть бути успадковані.
Тестовий код виглядає так:
|