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)
Verwenden Sie ein ConcurrentDictionary – Gusman
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. –
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