A lock utasítás egy adott objektum mutexét veszi, végrehajt egy utasításblokkot, majd feloldja a zárolást. Zár tartása esetén a zárat tartó szál újra elengedheti és elengedheti azt. Bármely más szál blokkolódik abban, hogy a zár megnyíljon, és megvárja, amíg a zár feloldódik.
Szemle:
Használd a zárkódot
Ekvivalens
Feltételezhető, hogy a Lock mögöttes kódját a Monitor valósította meg.
Mivel a kód próbálja... Végső blokk, tehát még ha kivételt is dobnak a zár szöveg törzsében, a zár feloldódik.
Nem használhatod az await operátor zárolást a nyilatkozat törzsében.Nem használhatod a nyilatkozat törzsébenvárjOperátor zár。 Nem használhatod az await operátor zárolást a nyilatkozat törzsében. Nem használhatod az await operátor zárolást a nyilatkozat törzsében. Ez a mondat nagyon fontos!
Dokumentáció:A hiperlink bejelentkezés látható.
Én magam tesztelem a kódot,Használd a Task-t a zároláshoz, és a wait segítségével blokkolj, a kód a következő:
A következő kód többszöri futtatása után a végrehajtási eredmény nem a vártnak megfelelő.
Miért? Ha megpróbálod használni az await kulcsszót a lock blokkban, akkor ezt a fordítási hibát kapod: nem vár a zár utasítás testében. Ennek oka, hogy a várakozás befejezése után a metódus egy másik szálban futhat a várakozás kulcsszó előtti szál helyett.lockkulcsszava-valUgyanaz a szálZár és elenged zárat a zárban。 Módosítsd a kódot, hogy intuitívabban lásd az okot:
Szerezd meg a zár szálazonosítóját és a zárkioldó szál azonosítóját,Nyilván nem egy szálon, így a zár nem engedhető sikeresen, ahogy az alábbi ábrán látható:
Próbáltam módosítani a kódot, szálkal teszteltem, többször is lefuttattam, és a vártoknak megfelelően működött, a kód a következő:
(Vége)
|