L'istruzione lock prende il mutex di un dato oggetto, esegue un blocco di istruzione e poi rilascia il lock. Quando si tiene una serratura, il filo che la tiene può acquisire e liberare nuovamente la serratura. Qualsiasi altro filo è bloccato dal poter ottenere la serratura e aspetta che venga liberato.
Recensione:
Usa il codice della serratura
Equivalente a
Si può pensare che il codice sottostante di Lock sia implementato da Monitor.
Dato che il codice usa try... finalblock, quindi anche se viene inserita un'eccezione nel corpo dell'istruzione lock, il lock viene rilasciato.
Non puoi usare il blocco operatore await nel corpo della dichiarazione.Non puoi usarlo nel corpo della dichiarazioneaspettaBlocco operatore。 Non puoi usare il blocco operatore await nel corpo della dichiarazione. Non puoi usare il blocco operatore await nel corpo della dichiarazione. Questa frase è molto importante!
Documentazione:Il login del link ipertestuale è visibile.
Io stesso testo il codice,Usa Task per ottenere la serratura e usa await per bloccare, il codice è il seguente:
Dopo aver eseguito il codice successivo più volte, il risultato dell'esecuzione non è quello previsto.
Perché? Se provi a usare la parola chiave await quando provi a usare la parola chiave await nel blocco lock, otterrai questo errore di compilation: await no può aspettare nel corpo di una istruzione lock. Il motivo è che, dopo aver completato await, il metodo può essere eseguito in un thread diverso invece che nel thread (thread che chiama) prima della parola chiave await.Parola chiave lock.stesso filoSblocca e sblocca la serratura nella serratura。 Modifica il codice per vedere il motivo in modo più intuitivo:
Ottieni l'ID del filettamento del blocco e l'id del filettamento del rilascio del blocco,Ovviamente non in un thread, quindi il lucchetto non può essere sbloccato con successo, come mostrato nella figura sottostante:
Ho provato a modificare il codice, testato con il thread, eseguito più volte, e ha funzionato come previsto, il codice è il seguente:
(Fine)
|