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

Вид: 29278|Відповідь: 2

[Джерело] .net/c# Thread thread Suspend and Resume застарілі рішення

[Копіювати посилання]
Опубліковано 17.05.2018 09:36:10 | | | |
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

Повідомте один або кілька потоків очікування, що сталася подія. Такі типи не можуть бути успадковані.


Тестовий код виглядає так:








Попередній:C# надсилає текстові повідомлення на мобільні телефони
Наступний:SQL видаляє простори з даних
 Орендодавець| Опубліковано 17.05.2018 21:14:51 |
_event. Set(); це продовження нитки
_event. Reset(); — це призупинення потоку
 Орендодавець| Опубліковано 29.05.2018 14:58:49 |
Якщо ви отримали ID поточного потоку, використовуйте :

Thread.CurrentThread.ManagedThreadId.ToString() (рекомендовано)
Застереження:
Усе програмне забезпечення, програмні матеріали або статті, опубліковані Code Farmer Network, призначені лише для навчання та досліджень; Вищезазначений контент не повинен використовуватися в комерційних чи незаконних цілях, інакше користувачі несуть усі наслідки. Інформація на цьому сайті надходить з Інтернету, і спори щодо авторських прав не мають до цього сайту. Ви повинні повністю видалити вищезазначений контент зі свого комп'ютера протягом 24 годин після завантаження. Якщо вам подобається програма, будь ласка, підтримуйте справжнє програмне забезпечення, купуйте реєстрацію та отримайте кращі справжні послуги. Якщо є будь-яке порушення, будь ласка, зв'яжіться з нами електронною поштою.

Mail To:help@itsvse.com