Soll dieser C # -Code refaktorisiert werden, um stattdessen die LazyT-Klasse zu verwenden?

7

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?

%Vor%     
Pure.Krome 24.08.2011, 01:09
quelle

2 Antworten

12

Ja, Sie können Lazy<T>

verwenden

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.

>     
BrokenGlass 24.08.2011, 01:13
quelle
8

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%     
BrunoLM 24.08.2011 02:07
quelle