2016-05-08 4 views
0

folgenden gegeben synchronisieren, was den besten Synchronisation TechnikerC# Best Practice für eine Sammlung

* Bitte beachten Sie, dass dies ein Beispiel Modell und es gibt viel mehr Dinge los sein würde.

die gemeinsam genutzte Ressource ist der Instrumenten-Wörterbuch, das von 2 Geräten aktualisiert wird:

(1) ein innerer Wert schnell aktualisiert wird.

(2) Die gesamte Sammlung wird aktualisiert.

public class Insturment 
    { 
     public Feed Feed{ get; set;} 
    } 

    static IDictionary<string,Instrument> instruments = new Dictionary<string,Instrument>(); 

    // (1) This happens frequently 
    public void OnNewFeed(Feed feed) 
    { 
     instruments[feed.Symbol].Feed = feed; 
    } 

    // (2) happens every few hours ,or manually triggered at any given time 
    public void BuildInstruments() 
    { 
     foreach(var instrument in newInstruments) 
     { 
      instruments.AddOrUpdate(insturment.Symbol,insturment); 
     }  
    } 

Ich dachte an den gleichen Grundkonzept Block Gewinde auf UpdateFeed(), wenn die gesamte Kollektion neu erstellt wird ein manuelles Reset-Ereignis verwenden.

ManualResetEvent _mre = new ManualResetEvent(false); 

    public void OnNewFeed(Feed feed) 
    { 
     _mre.WaitOne(); 
     instruments[feed.Symbol].Feed = feed; 
    } 

    public void BuildInstruments() 
    { 
     _mre.Reset(); 

     foreach(var instrument in newInstruments) 
     { 
      instruments.AddOrUpdate(insturment.Symbol,insturment); 
     } 

     _mre.Set();  
    }  

Oder die gleiche Sache mit jeder Art von Task-Wrapper und warten darauf. so etwas wie dieses Konstrukt: The anser by Stephen Cleary

  • Exkurs mir Daten integraty ist es egal, wenn aus dem Wörterbuch zu lesen. was bedeutet, dass es mir nichts ausmacht, wenn man zu irgendeinem Zeitpunkt nicht aktualisierte Werte aus dem Wörterbuch erhält. Es macht mir nichts aus, dass das Update für immer verloren geht, weil ich gerade das gesamte Instrument ersetzt habe, das gerade aktualisiert wurde.

Fragen:

1) Kann man denken an einen besseren Ansatz, um die Operationen auf Instrumente Wörterbuch zu synchronisieren.

2) Gibt es irgendwelche Vorteile der Verwendung von async/await für eine Aufgabe, die das WaitHandle umhüllt? (Wie die in den obigen Link beschrieben)

+2

Verwenden Sie ein ConcurrentDictionary – Gusman

+0

lässt sagen, dass ich bitte beschreiben Sie, wie das mir helfen würde. und ich bin froh, dass du es angesprochen hast. :) beachten Sie bitte 2 Dinge, ich ersetze das gesamte Instrument-Objekt in Build() und ich möchte nicht den neuen Feed kommen, während ich dieses Elternobjekt im Wörterbuch ersetzen. –

+0

Entschuldigung, ich habe deine Frage missverstanden, vergiss es :), es sei denn du erwartest mehrere OnNewFeed aus verschiedenen Quellen zu haben, dann wird es dir nicht helfen, sorry für den Fehler. – Gusman

Antwort

1

Best Practice zum Synchronisieren einer Sammlung

Ich würde sagen, die beste Praxis lock es sei denn, Sie zu verwenden ist Notwendigkeit etwas anderes. B. wenn Sie eine asynchrone Verriegelung benötigen, können Sie SemaphoreSlim oder eine der AsyncLock Implementierungen verwenden.

Oder die gleiche Sache mit jeder Art von Task-Wrapper und warten darauf.

Ich würde diese Lösung nicht für die Sammlung Synchronisation verwenden. Wenn Sie eine async-kompatible Synchronisation benötigen, verwenden Sie ein async-kompatibles Synchronisationselement (z. B. SemaphoreSlim oder AsyncLock). Und wenn Sie es nicht brauchen, dann verwenden Sie einfach lock.

Die Task -wrapper-Around-WaitHandle Situation wirklich nur, wenn Sie haben benötigt wird ein WaitHandle -basierte Objekt zu verwenden und wollen verbrauchen sie mit asynchronem Code (zum Beispiel es zwischen Prozessen geteilt wird). Es klingt nicht so, als ob dieses Szenario hier zutrifft.

Seitliche Anmerkung Ich interessiere mich nicht für Datenintegrat beim Lesen aus dem Wörterbuch. was bedeutet, dass es mir nichts ausmacht, wenn man zu irgendeinem Zeitpunkt nicht aktualisierte Werte aus dem Wörterbuch erhält.

Ich empfehle sowieso auf Lesevorgänge zu sperren. Es gibt eine Vielzahl von Problemen (wie Reißen), die auftreten können, wenn Sie dies nicht tun.

Nur als eine Randnotiz: Ihre Beschreibung Ihres Szenarios verwendet weiterhin den Begriff "Update". Es klingt so, als ob Sie eher eine Producer/Consumer-Lösung oder möglicherweise ein Publish/Subscribe wie Rx und keine gemeinsame, synchronisierte Sammlung wünschen.