Pokud chce vlákno pozastavit nebo pokračovat, už jsem použil obě metody Suspend a Resume a tyto dvě metody používám k ovládání vlákna, což je vlastně problém, a tehdy mi to bylo jedno, takže to dnes vyndáme a prostudujeme!
Jaký je problém s použitím výše uvedených dvou metod pro pozastavení a pokračování v vláknech?
Například pokud zavoláme metodu Suspend pro pozastavení vlákna a pak ihned zavoláme metodu Resume pro pokračování pozastaveného vlákna, může nastat problém.
Protože po zavolání metody Suspend pro pozastavení vlákna nemusí být vlákno okamžitě pozastaveno, zde to trvá zpracovatelský čas, v tomto okamžiku ihned zavoláte metodu Resume pro pokračování pozastaveného vlákna a program se okamžitě zasekne!
Microsoft vysvětluje:
Nepoužívejte metody Suspend a Resume k synchronizaci aktivity vláken. Existuje způsob, jak zjistit, co je kód, když pozastavíte spuštění vlákna? Pokud držíte zámek během vyhodnocování bezpečnostních oprávnění, mohou být zablokována i další vlákna ve vašem pozastaveném vlákně v AppDomain. Pokud při spuštění konstruktoru třídy pozastavíte další vlákna v AppDomain, pokusy o použití třídy jsou zablokovány. Patové situace mohou snadno nastat.
// Shrnutí: Pokračujte v pozastaveném vlákně. // Anomálie: T:System.Threading.ThreadStateException: Vlákno není zahájeno, mrtvé ani není ve stavu čekající na vyřízení. // T:System.Security.SecurityException: Volající nemá správné System.Security.Permissions.SecurityPermission. [Zastaralé("Vlákno. Životopis byl zrušen. Použijte prosím jiné třídy v System.Threading, jako jsou Monitor, Mutex, Event a Semaphore, k synchronizaci vláken nebo ochraně zdrojů. Přihlášení k hypertextovému odkazu je viditelné.", nepravda)] [BezpečnostBezpečnéKritické] veřejná prázdnota Resume(); Jak tento problém vyřešit?
Třída ManualResetEvent
Upozorněte jedno nebo více čekajících vláken, že došlo k události. Takové typy nelze dědit.
Testovací kód je následující:
|