Príkaz zámku vezme mutex daného objektu, vykoná blok príkazu a potom uvoľní zámok. Pri držaní zámku môže niť, ktorá ho drží, zámok opäť zachytiť a uvoľniť. Akékoľvek iné vlákno je zablokované a čaká, kým sa zámok uvoľní.
Revízia:
Použi kód zámku
Ekvivalent
Dá sa predpokladať, že základný kód Locku implementuje Monitor.
Keďže kód používa try... Finalblock, takže aj keď je v tele príkazu zámku vložená výnimka, zámok sa uvoľní.
Nemôžete použiť zámok operátora await v tele výroku.Nemôžete ho použiť v tele vyhláseniapočkajteOperátorský zámok。 Nemôžete použiť zámok operátora await v tele výroku. Nemôžete použiť zámok operátora await v tele výroku. Táto veta je veľmi dôležitá!
Dokumentácia:Prihlásenie na hypertextový odkaz je viditeľné.
Kód testujem sám,Použi Úlohu na získanie zámku a použi čakanie na blokovanie, kód je nasledovný:
Po opakovanom spustení nasledujúceho kódu výsledok vykonania nie je taký, ako sa očakávalo.
Prečo? Ak sa pokúsite použiť kľúčové slovo await pri použití kľúčového slova await v lock blocku, dostanete túto chybu kompilácie: cannot await v tele príkazu lock. Dôvodom je, že po dokončení čakania môže metóda bežať v inom vlákne namiesto vlákna (volajúceho vlákna) pred kľúčovým slovom čakať.lockkeywordRovnaká diskusiaZamkni a uvoľni zámok v zámku。 Upravte kód, aby ste pochopili dôvod intuitívnejšie:
Získaj ID závitu zámku a ID závitu uvoľnenia zámku,Samozrejme nie v žiadnej diskusii, takže zámok nemožno úspešne uvoľniť, ako je znázornené na obrázku nižšie:
Skúšal som upraviť kód, testoval som s vláknom, viackrát ho spustil a fungovalo to podľa očakávania, kód je nasledovný:
(Koniec)
|