Ak chce vlákno pozastaviť alebo pokračovať, už som použil obe metódy Suspend a Resume a tieto dve metódy používam na ovládanie vlákna, čo je vlastne problém, a vtedy mi to nevadilo, tak ho dnes vytiahnime a preskúmajme!
Aký je problém s použitím vyššie uvedených dvoch metód na pozastavenie a pokračovanie vo vláknach?
Napríklad, ak zavoláme metódu Suspend na pozastavenie vlákna a potom okamžite zavoláme metódu Resume na pokračovanie pozastaveného vlákna, môže nastať problém.
Pretože po zavolaní metódy Suspend na pozastavenie vlákna nemusí byť vlákno pozastavené okamžite, tu to trvá čas spracovania, v tomto momente okamžite zavoláte metódu Resume na pokračovanie pozastaveného vlákna a program sa okamžite zasekne!
Microsoft vysvetľuje:
Nepoužívajte metódy Suspend a Resume na synchronizáciu aktivity vlákien. Existuje spôsob, ako zistiť, čo je kód, keď pozastavíte vykonávanie vlákna? Ak počas hodnotenia bezpečnostných práv držíte zámok, ostatné vlákna vo vašom pozastavenom vlákne v AppDomain môžu byť zablokované. Ak pri vykonávaní konštruktora triedy pozastavíte iné vlákna v AppDomain, pokusy o použitie triedy sú zablokované. Patové situácie sa môžu ľahko vyskytnúť.
// Súhrn: Pokračujte v pozastavenej diskusii. // Anomália: T:System.Threading.ThreadStateException: Vlákno nie je spustené, mŕtve ani nie je v stave čakania. // T:System.Security.SecurityException: Volajúci nemá správne System.Security.Permissions.SecurityPermission. [Zastarané("Vlákno. Životopis bol zastaraný. Prosím, používajte iné triedy v System.Threading, ako sú Monitor, Mutex, Event a Semaphore, na synchronizáciu vlákien alebo ochranu zdrojov. Prihlásenie na hypertextový odkaz je viditeľné.", nepravda)] [BezpečnosťBezpečnéKritické] verejná prázdnota Resume(); Ako tento problém vyriešiť?
Trieda ManualResetEvent
Upozornite jednu alebo viac čakajúcich vlákien, že nastala udalosť. Takéto typy sa nedajú dediť.
Testovací kód je nasledovný:
|