2016-07-05 12 views
0

Hallo Ich habe eine Anwendung, die eine Liste von Strichen speichern und mit Seiten zeigen. Der Benutzer wird ständig auf seine Geräte aktualisieren.C#: Leistungsproblem mit Sperren

List<data> li = null; 

lock (locks) { 
    li = dataList.ToList();  
} 

var a = li.ToDataListStruct(); 

blah .... 

Wäre dies viel effizienter als die unten sein:

lock (locks) { 
     var a = li.ToDataListStruct(); 

     blah .... 
    } 

ToDataListStruct ist Mapping ein Objekt in der Liste auf eine Art von Objekt und gibt eine neue Liste.

Dies ist eine Serverseite. Ersteres: nur gesperrt, wenn die ToList-Funktion aufgerufen wird, und der Rest des Codes, der die neue Liste verwendet, wird nicht gesperrt. Der zweite: Es hat den gesamten Code gesperrt.

Ist die erste bessere Performance über die letzten

+1

Ich würde denken, die erste ist _better_ weil Sie weniger Zeit in der 'lock()' – MickyD

+0

Ich weiß nicht, wie effizient ToList ist. Innerhalb von ToDataListStruct habe ich eine Liste von Seiten und jede Seite habe ich eine Liste von Strichen, so dass ein bisschen for-Schleife ausgeführt werden muss. – LittleFunny

+1

Ja. Wenn Sie sich Ihre beiden Codebeispiele ansehen, hat das erste 'ToList()', aber alles andere einschließlich 'blah' ist außerhalb des' lock() '. Während der zweite, haben Sie viel Code im Block einschließlich der gemeinsamen "Blah". Generell möchten Sie die Thread-Sperre so schnell wie möglich beenden, wenn der Code keinen Datenschutz mehr benötigt. – MickyD

Antwort

1

Je weniger Verriegelung haben die Blöcke andere besser ist.

Natürlich hat C# Standardbibliothek gleichzeitige Sammlungen.

Auschecken System.Collections.Concurrent Namensraum.

ConcurrentQueue<data> queue = new ConcurrentQueue<data>(); 

foreach (data item in queue) 
{ 
    blah... 
} 

Gleichzeitige Sammlungen übernehmen die Sperrung und Versionierung für Sie.