Questo articolo è un articolo speculare di traduzione automatica, clicca qui per saltare all'articolo originale.

Vista: 193519|Risposta: 11

[Fonte] .net/c# Lock(string){...} Concurrency multithreaded utente Spiegazione dettagliata

[Copiato link]
Pubblicato su 03/07/2019 15:25:19 | | | |
Scenari di uso improprio comuni: Per evitare pagamenti duplicati di ordini causati da utenti che cliccano accidentalmente più volte sul pulsante di pagamento, usiamo il lock (numero d'ordine) per garantire che solo un thread possa eseguire l'operazione sull'ordine.

Questa idea è buona, almeno migliore del lock (un oggetto statico privato per l'elaborazione delle classi), perché l'effetto del numero d'ordine di blocco è di bloccare solo l'operazione dell'ordine corrente 1, e se la variabile statica blocca, cioè bloccare tutti gli ordini, farà sì che tutti gli ordini vengano messi in coda, il che è ovviamente irragionevole.

Quindi, il metodo del numero di ordine menzionato all'inizio di questo articolo può ottenere l'effetto desiderato? Usiamo un po' di codice per ripristinare lo scenario d'uso.

Se ignori le informazioni degli utenti e altre validazioni, il codice appare più o meno così:
Per la parola chiave della serratura, MSDN include informazioni che si possono trovare su Baidu, e sembra che sia consigliato di non usare lock (string), e il motivo è lo stesso. Il seguente passaggio è tratto dal consiglio di MSDN sulle corde dei lock:

Il problema del lock("mioLock") si verifica perché qualsiasi altro codice che utilizza la stessa stringa nel processo condividerà lo stesso blocco.
Questa frase nasconde un enorme meccanismo, cioè "la stessa stringa".

Cos'è "la stessa stringa"? Vedi il codice:


Str1 e str2 sono la stessa stringa sopra? La risposta è sì.

Vedi ancora:


Str1 e str2 sopra sono ancora la stessa corda? La risposta è no.

Ok, torniamo alla questione del pagamento dell'ordine. Nel nostro codice, lock(orderNumber), quando l'utente clicca accidentalmente qualche altra volta dopo aver spostato la mano, l'orderNumber che inserisce questa azione è sempre la stessa stringa? La risposta è no. Questo per dire

Il codice che gestisce l'ordine sopra non agisce effettivamente come un blocco.

In effetti, esistono due tipi di confronti di stringhe, vedi il codice:


La prima riga del codice sopra produce Vero, e la seconda riga produce Falso. Credo che tu abbia capito cosa intende MSDN con "la stessa stringa" senza la mia spiegazione.

La soluzione migliore

Soluzioni per stringhe di bloccaggio ottimale:





Codice demo:




Nel sito web, a volte può essere usata una variabile globale; questa variabile globale, quando più utenti accedono contemporaneamente, può apparire anomala; in questo momento imposteremo un blocco globale, ma lo svantaggio è che tutti gli accessi attenderanno a turno.

In alcuni scenari, ad esempio, lo stesso utente può commentare solo una volta entro 15 secondi; se viene utilizzato il blocco globale, la funzione commento sarà molto lenta da elaborare quando il numero di utenti aumenta, il che influenzerà notevolmente l'esperienza utente.

In questo momento,Possiamo impostare il lock per ogni utente individualmente, lock(string){...}, e il nome del lock può essere definito come:Nome del metodo + ID utenteIn questo modo, ogni utente ha un blocco indipendente e, nel valutare l'intervallo dei commenti, questo non influenzerà i commenti degli altri utenti.

(Fine)




Precedente:La scrittura tipografica LPSTR del MFC
Prossimo:OpenSSL è ovviamente stato aggiornato, Apache continua a segnalare la vecchia versione?
Pubblicato su 13/05/2022 14:27:17 |
Quindi, il metodo del numero di ordine menzionato all'inizio di questo articolo può ottenere l'effetto desiderato? Usiamo un po' di codice per ripristinare lo scenario d'uso.
 Padrone di casa| Pubblicato su 12/08/2023 19:48:15 |
.NET/C# Lock Principle Monitor fornisce una spiegazione approfondita
https://www.itsvse.com/thread-9633-1-1.html
Pubblicato su 07/01/2023 11:22:02 |
L'ho incontrato anche nella mia pratica lavorativa, grazie all'autore di questo articolo tecnico
Pubblicato su 03/07/2019 20:02:32 |
Questa è roba buona
Pubblicato su 18/06/2021 14:24:43 |
Quanto mostrato nella pagina è che il codice non può essere visualizzato
Pubblicato su 29/06/2021 00:21:16 |
Guarda il codice
Pubblicato su 29/06/2021 00:54:24 |
Non riesco a vedere il codice
Pubblicato su 14/05/2022 10:06:46 |
Impara a imparare
Pubblicato su 28/05/2022 22:03:59 |
Molto bene, imparato
Pubblicato su 28/11/2022 21:46:47 |
Si può usare asp.net?
Disconoscimento:
Tutto il software, i materiali di programmazione o gli articoli pubblicati dalla Code Farmer Network sono destinati esclusivamente all'apprendimento e alla ricerca; I contenuti sopra elencati non devono essere utilizzati per scopi commerciali o illegali, altrimenti gli utenti dovranno sostenere tutte le conseguenze. Le informazioni su questo sito provengono da Internet, e le controversie sul copyright non hanno nulla a che fare con questo sito. Devi eliminare completamente i contenuti sopra elencati dal tuo computer entro 24 ore dal download. Se ti piace il programma, ti preghiamo di supportare software autentico, acquistare la registrazione e ottenere servizi autentici migliori. In caso di violazione, vi preghiamo di contattarci via email.

Mail To:help@itsvse.com