Ten artykuł jest lustrzanym artykułem tłumaczenia maszynowego, kliknij tutaj, aby przejść do oryginalnego artykułu.

Widok: 193519|Odpowiedź: 11

[Źródło] .net/c# Wielowątkowaty blokada współbieżności użytkownika (string){...} Szczegółowe wyjaśnienie

[Skopiuj link]
Opublikowano 03.07.2019 15:25:19 | | | |
Typowe scenariusze niewłaściwego użycia: Aby zapobiec duplikatowi płatności zleceń spowodowanym przypadkowym wielokrotnym kliknięciem przycisku płatności, używamy blokady (numer zamówienia), aby zapewnić, że tylko jeden wątek może wykonać operację na zleceniu.

Ten pomysł jest dobry, przynajmniej lepszy niż blokada (prywatny statyczny obiekt do przetwarzania klas), ponieważ efektem blokowania numeru zamówienia jest zablokowanie tylko operacji bieżącego zamówienia 1, a jeśli zablokuje zmienną statyczną, czyli blokuje wszystkie zlecenia, spowoduje kolejkowanie wszystkich poleceń, co jest oczywiście nierozsądne.

Czy metoda blokady (numer zamówienia) wspomniana na początku tego artykułu może osiągnąć pożądany efekt? Najpierw użyjmy kodu, aby przywrócić sytuację użytkowania.

Jeśli zignorujesz informacje użytkownika i inne weryfikacje, kod wygląda mniej więcej tak:
Jeśli chodzi o słowo kluczowe z zakleszczeniem, MSDN zawiera informacje dostępne na Baidu i wydaje się, że zaleca się nie używać lock(string), a powód jest ten sam. Poniższy fragment pochodzi z porad MSDN dotyczących stringów blokujących:

Problem z blokadą ("myLock") pojawia się, ponieważ każdy inny kod używający tego samego ciągu w procesie będzie miał ten sam zamek.
To zdanie ukrywa ogromny mechanizm, czyli "ten sam ciąg".

Co to jest "ten sam sznur"? Zobacz kod:


Czy str1 i str2 to ta sama struna powyżej? Odpowiedź brzmi: TAK.

Zobacz ponownie:


Czy str1 i str2 powyżej to nadal ta sama struna? Odpowiedź brzmi: NIE.

Dobrze, wróćmy do kwestii płatności zamówienia. W naszym kodzie, lock(orderNumber), gdy użytkownik przypadkowo kliknie kilka razy po przesunięciu ręką, czy numer zamówienia wpisujący tę akcję jest tym samym ciągiem za każdym razem? Odpowiedź brzmi: NIE. To znaczy

Kod obsługujący powyższą kolejność nie działa faktycznie jako blokada.

W rzeczywistości istnieją dwa rodzaje porównań ciągów znaków, zobacz kod:


Pierwsza linia powyższego kodu daje Prawda, a druga linia Fałszywa. Wydaje mi się, że rozumiesz, co MSDN oznacza "ten sam ciąg" bez mojego wyjaśnienia.

Najlepsze rozwiązanie

Rozwiązania dla optymalnych sznurów blokujących:





Kod demonstracyjny:




Na stronie internetowej czasem może być użyta zmienna globalna, która przy jednoczesnym dostępie wielu użytkowników może wydawać się nienormalna; wtedy ustawiamy globalną blokadę, ale wadą jest to, że wszystkie dostępy będą czekać na kolejno.

W niektórych sytuacjach, na przykład, ten sam użytkownik może skomentować tylko raz w ciągu 15 sekund, jeśli użyje się globalnego zamknięcia, funkcja komentarza będzie bardzo wolna w przetwarzaniu liczby użytkowników, co znacznie wpłynie na doświadczenie użytkownika.

W tym momencie,Możemy ustawić blokadę dla każdego użytkownika osobno, lock(string){...}, a nazwa blokady może być zdefiniowana jako:Nazwa metody + identyfikator użytkownikaW ten sposób każdy użytkownik ma niezależną blokadę, a przy ocenie interwału komentarzy nie wpływa to na komentarze innych użytkowników.

(Koniec)




Poprzedni:Pismo na LPSTR MFC
Następny:OpenSSL ewidentnie został zaktualizowany, Apache nadal wyświetla starą wersję?
Opublikowano 13.05.2022 14:27:17 |
Czy metoda blokady (numer zamówienia) wspomniana na początku tego artykułu może osiągnąć pożądany efekt? Najpierw użyjmy kodu, aby przywrócić sytuację użytkowania.
 Ziemianin| Opublikowano 12.08.2023 19:48:15 |
.NET/C# Lock Principle Monitor zapewnia szczegółowe wyjaśnienie
https://www.itsvse.com/thread-9633-1-1.html
Opublikowano 07.01.2023 11:22:02 |
Spotkałem się z tym także w mojej praktyce zawodowej, dzięki autorowi za ten artykuł techniczny
Opublikowano 03.07.2019 20:02:32 |
To naprawdę dobre rzeczy
Opublikowano 18.06.2021 14:24:43 |
Na stronie pokazano, że kod nie jest widoczny
Opublikowano 29.06.2021 00:21:16 |
Spójrz na kod
Opublikowano 29.06.2021 00:54:24 |
Nie widzę kodu
Opublikowano 14.05.2022 10:06:46 |
Naucz się uczyć
Opublikowano 28.05.2022 22:03:59 |
Bardzo dobrze, uczony
Opublikowano 28.11.2022 21:46:47 |
Czy asp.net można wykorzystać?
Zrzeczenie się:
Całe oprogramowanie, materiały programistyczne lub artykuły publikowane przez Code Farmer Network służą wyłącznie celom edukacyjnym i badawczym; Powyższe treści nie mogą być wykorzystywane do celów komercyjnych ani nielegalnych, w przeciwnym razie użytkownicy ponoszą wszelkie konsekwencje. Informacje na tej stronie pochodzą z Internetu, a spory dotyczące praw autorskich nie mają z nią nic wspólnego. Musisz całkowicie usunąć powyższą zawartość z komputera w ciągu 24 godzin od pobrania. Jeśli spodoba Ci się program, wspieraj oryginalne oprogramowanie, kup rejestrację i korzystaj z lepszych, autentycznych usług. W przypadku naruszenia praw prosimy o kontakt mailowy.

Mail To:help@itsvse.com