Thread.Suspend is verouderd. Gebruik alstublieft andere klassen in System.Threading, zoals Monitor, Mutex, Event en Semaphore, om threads te synchroniseren of resources te beschermen. De hyperlink-login is zichtbaar. Thread.Resume is verouderd. Gebruik alstublieft andere klassen in System.Threading, zoals Monitor, Mutex, Event en Semaphore, om threads te synchroniseren of resources te beschermen. De hyperlink-login is zichtbaar. Als de thread wil pauzeren of doorgaan, heb ik eerder de twee methoden Suspend en Resume gebruikt, en deze twee methoden gebruikt om de thread te bedienen, wat eigenlijk problematisch is, en ik vond het toen niet belangrijk, dus laten we het vandaag nog bestuderen!
Wat is het probleem met het gebruik van bovenstaande twee methoden om threads te suspenderen en voort te zetten?
Als we bijvoorbeeld de Suspend-methode aanroepen om de thread te suspenderen, en vervolgens direct de Resume-methode aanroepen om de geschorste thread voort te zetten, dan kan er een probleem ontstaan.
Want nadat je de Suspend-methode hebt aangeroepen om de thread te suspenderen, wordt de thread mogelijk niet direct gesuspendeerd, hier duurt het verwerkingstijd, op dat moment roep je direct de Resume-methode aan om de geschorste thread voort te zetten, en het programma hangt meteen vast!
De uitleg van Microsoft is:
Gebruik de methoden Suspend en Resume niet om threadactiviteit te synchroniseren. Is er een manier om te weten welke code er is wanneer je de uitvoering van de thread pauzeert? Als je een lock vasthoudt tijdens de evaluatie van beveiligingsprivileges, kunnen andere threads in je geschorste thread in AppDomain worden geblokkeerd. Als je andere threads in de AppDomain opschort tijdens het uitvoeren van de class constructor, worden pogingen om de klasse te gebruiken geblokkeerd. Doodlopende situaties kunnen gemakkelijk ontstaan.
// Samenvatting: Ga verder met de onderbroken discussie. // Anomalie: T:System.Threading.ThreadStateException: De thread is niet gestart, dood of niet in een wachtende staat. // T:System.Security.SecurityException: De aanroeper heeft niet de juiste System.Security.Permissions.SecurityPermissions. [Verouderd("Thread.Resume is verouderd. Gebruik alstublieft andere klassen in System.Threading, zoals Monitor, Mutex, Event en Semaphore, om threads te synchroniseren of resources te beschermen. De hyperlink-login is zichtbaar.", vals)] [SecuritySafeCritical] openbare leegte Resume(); Hoe los je dit probleem op?
ManualResetEvent-klasse
Meld één of meer wachtende threads dat er een gebeurtenis heeft plaatsgevonden. Dergelijke types kunnen niet worden geërfd.
De testcode is als volgt:
|