Dit artikel is een spiegelartikel van machinevertaling, klik hier om naar het oorspronkelijke artikel te gaan.

Bekijken: 29278|Antwoord: 2

[Bron] .net/c# Threadthread Suspend en Resume maakt verouderde oplossingen

[Link kopiëren]
Geplaatst op 17-05-2018 09:36:10 | | | |
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:








Vorig:C# stuurt sms'jes naar mobiele telefoons
Volgend:SQL verwijdert ruimtes uit de data
 Huisbaas| Geplaatst op 17-05-2018 21:14:51 |
_event. Set(); is om de draad voort te zetten
_event. Reset(); is om de draad op te schorsen.
 Huisbaas| Geplaatst op 29-05-2018 14:58:49 |
Als je de ID van de huidige thread krijgt, gebruik dan :

Thread.CurrentThread.ManagedThreadId.ToString() (aanbevolen)
Disclaimer:
Alle software, programmeermaterialen of artikelen die door Code Farmer Network worden gepubliceerd, zijn uitsluitend bedoeld voor leer- en onderzoeksdoeleinden; De bovenstaande inhoud mag niet worden gebruikt voor commerciële of illegale doeleinden, anders dragen gebruikers alle gevolgen. De informatie op deze site komt van het internet, en auteursrechtconflicten hebben niets met deze site te maken. Je moet bovenstaande inhoud volledig van je computer verwijderen binnen 24 uur na het downloaden. Als je het programma leuk vindt, steun dan de echte software, koop registratie en krijg betere echte diensten. Als er sprake is van een inbreuk, neem dan contact met ons op via e-mail.

Mail To:help@itsvse.com