Ich habe den folgenden Code, der über mehrere Web-Anfragen gleichzeitig aufgerufen werden kann. Daher möchte ich nicht, dass die zweite + Anfrage auf die Datenbank trifft, sondern auf die erste wartet.
Soll ich dies umgestalten, um stattdessen die Klasse Lazy<T>
keyword zu verwenden? Wenn 10 Aufrufe an einen Lazy<T>
Code gleichzeitig erfolgen, warten 9 dieser Aufrufe auf den ersten Code?
Ja, Sie können Lazy<T>
Von MSDN :
Lazy-Objekte sind standardmäßig threadsicher. Das heißt, wenn der Konstruktor spezifiziert nicht die Art der Threadsicherheit, die Lazy Objekte, die es erstellt, sind Thread-sicher. In Multithread-Szenarios ist der erster Thread, um auf die Value-Eigenschaft eines Thread-sicheren Lazy zuzugreifen Objekt initialisiert es für alle nachfolgenden Zugriffe auf alle Threads und Alle Threads teilen sich die gleichen Daten. Daher spielt es keine Rolle, welche Thread initialisiert das Objekt, und Race-Bedingungen sind gutartig.
Und ja, es ist kein Schlüsselwort - es ist eine .NET-Framework-Klasse, die den oft erforderlichen Anwendungsfall für die verzögerte Initialisierung formalisiert und diese sofort bereitstellt, damit Sie sie nicht "manuell" machen müssen.
>Wie @ BrokenGlass darauf hingewiesen hat, ist es sicher. Aber ich konnte nicht widerstehen und musste einen Test machen ...
Es wird nur eine Thread-ID gedruckt ...
%Vor%Aber welcher ist schneller? Aus den Ergebnissen habe ich ...
Ausführen des Codes 100 mal
%Vor%Ausführen des Codes 100000000 mal
%Vor%Testcode:
%Vor%Testmethode:
%Vor%Tags und Links .net c# lazy-loading double-checked-locking