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

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

[Источник] .net/c# Thread thread Suspend and Resume устаревшие решения

[Скопировать ссылку]
Опубликовано 17.05.2018 9: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 |
Если вы получили идентификатор текущей темы, используйте :

Thread.CurrentThread.ManagedThreadId.ToString() (рекомендуемо)
Отказ:
Всё программное обеспечение, программные материалы или статьи, публикуемые Code Farmer Network, предназначены исключительно для учебных и исследовательских целей; Вышеуказанный контент не должен использоваться в коммерческих или незаконных целях, иначе пользователи несут все последствия. Информация на этом сайте взята из Интернета, и споры по авторским правам не имеют отношения к этому сайту. Вы должны полностью удалить вышеуказанный контент с компьютера в течение 24 часов после загрузки. Если вам нравится программа, пожалуйста, поддержите подлинное программное обеспечение, купите регистрацию и получите лучшие подлинные услуги. Если есть нарушение, пожалуйста, свяжитесь с нами по электронной почте.

Mail To:help@itsvse.com