Ten artykuł jest lustrzanym artykułem tłumaczenia maszynowego, kliknij tutaj, aby przejść do oryginalnego artykułu.

Widok: 29278|Odpowiedź: 2

[Źródło] .net/c# Wątki wątkowe Suspend and Resume przestarzałe rozwiązania

[Skopiuj link]
Opublikowano 17.05.2018 09:36:10 | | | |
Wątek.Zawieszenie zostało wycofane z eksploatacji.  Prosimy o używanie innych klas w System.Threading, takich jak Monitor, Mutex, Event i Semaphore, aby synchronizować wątki lub chronić zasoby.  Logowanie do linku jest widoczne.
Wątek. Resume zostało wycofane.  Prosimy o używanie innych klas w System.Threading, takich jak Monitor, Mutex, Event i Semaphore, aby synchronizować wątki lub chronić zasoby.  Logowanie do linku jest widoczne.
Jeśli wątek chce się zatrzymać lub kontynuować, korzystałem już z dwóch metod: Suspend i Resume, i używam tych dwóch metod do obsługi wątku, co jest problematyczne, a wtedy mnie to nie obchodziło, więc wyjmijmy to i przestudiujmy dzisiaj!

Jaki jest problem z używaniem powyższych dwóch metod do zawieszania i kontynuowania wątków?

Na przykład, jeśli wywołamy metodę Suspend, aby zawiesić wątek, a następnie natychmiast wywołamy metodę Resume, aby kontynuować wątek zawieszony, może pojawić się problem.

Ponieważ po wywołaniu metody Suspend w celu zawieszenia wątku, wątek może nie zostać zawieszony od razu, tutaj zajmuje to czas przetwarzania, wtedy natychmiast wywołujesz metodę Resume, aby kontynuować wątek zawieszony, a program natychmiast się zawiesza!

Wyjaśnienie Microsoftu jest następujące:


Nie używaj metod Suspend i Resume do synchronizacji aktywności wątków. Czy jest sposób, aby dowiedzieć się, czym jest kod, gdy wstrzymasz wykonanie wątku? Jeśli podczas oceny uprawnień bezpieczeństwa przytrzymasz blokadę, inne wątki w twoim zawieszonym wątku w AppDomain mogą zostać zablokowane. Jeśli zawiesz inne wątki w AppDomain podczas wykonywania konstruktora klasy, próby użycia klasy są blokowane. Łatwo mogą wystąpić impasy.

//
        Streszczenie:
        Kontynuuj wątek zawieszony.
        //
        Anomalia:
        T:System.Threading.ThreadStateException:
        Wątek nie jest rozpoczęty, martwy ani nie znajduje się w stanie oczekującym.
        //
        T:System.Security.SecurityException:
        Dzwoniący nie posiada właściwego System.Security.Permissions.SecurityPermission.
        [Przestarzałe("Wątek.CV zostało wycofane.  Prosimy o używanie innych klas w System.Threading, takich jak Monitor, Mutex, Event i Semaphore, aby synchronizować wątki lub chronić zasoby.  Logowanie do linku jest widoczne.", fałszywe)]
        [BezpieczeństwoKrytyczne]
        public void Resume();

Jak rozwiązać ten problem?



Klasa ManualResetEvent

Powiadom jeden lub więcej wątków oczekujących o zdarzeniu. Takich typów nie można dziedziczyć.


Kod testu jest następujący:








Poprzedni:C# wysyła wiadomości tekstowe na telefony komórkowe
Następny:SQL usuwa spacje z danych
 Ziemianin| Opublikowano 17.05.2018 21:14:51 |
_event. set(); to kontynuować wątek
_event. Reset(); to zawieszenie nici
 Ziemianin| Opublikowano 29.05.2018 14:58:49 |
Jeśli uzyskasz identyfikator bieżącego wątku, użyj :

Thread.CurrentThread.ManagedThreadId.ToString() (zalecane)
Zrzeczenie się:
Całe oprogramowanie, materiały programistyczne lub artykuły publikowane przez Code Farmer Network służą wyłącznie celom edukacyjnym i badawczym; Powyższe treści nie mogą być wykorzystywane do celów komercyjnych ani nielegalnych, w przeciwnym razie użytkownicy ponoszą wszelkie konsekwencje. Informacje na tej stronie pochodzą z Internetu, a spory dotyczące praw autorskich nie mają z nią nic wspólnego. Musisz całkowicie usunąć powyższą zawartość z komputera w ciągu 24 godzin od pobrania. Jeśli spodoba Ci się program, wspieraj oryginalne oprogramowanie, kup rejestrację i korzystaj z lepszych, autentycznych usług. W przypadku naruszenia praw prosimy o kontakt mailowy.

Mail To:help@itsvse.com