Hallo zusammen,
vielleicht kann mir ja Jemand von euch weiterhelfen. Folgende Situation:
Ich empfange Objekte des Typs ServerProtokoll<T> über ein Socket, welche ich im Nachhinein auswerten möchte. Dafür gibt es eine API, welche mir diese Daten vom Server holen soll.
Hier mal eine Funktion daraus:
Wenn nun die Mitarbeiter durch einen anderen Client aktualisiert werden, dann sendet der Server automatisch eine neue Nachricht an alle Clienten, die dafür sorgt, dass die Mitarbeiterliste aktualisiert wird. Nun kann es ja vorkommen, dass der Client gerade eine Schleife auf die Liste anwendet.
Typischer Fall wäre hier z.B.
Würde ich nun die Liste ändern, dann würde spätestens jetzt mein Client abstürzen.
Ich könnte nun entweder immer die Liste vorher kopieren, oder mithilfe eines locks blockieren, doch dann müsste ich dies ja an jeder Stelle machen. Gibt es hier eine Möglichkeit das nur an einer Stelle direkt zu ändern? Ich könnte mir die Liste natürlich auch jedes mal vom Server laden lassen, doch das wäre Aufgrund der Größe des Objekts eher suboptimal.
Am besten wäre es, wenn eine Änderung der liste direkt dazu führt, dass aktuell laufende Schleifen quasi wiederholt werden.
Habt Ihr eine Idee, wie sich das am besten realisieren lässt?
LG
vielleicht kann mir ja Jemand von euch weiterhelfen. Folgende Situation:
Ich empfange Objekte des Typs ServerProtokoll<T> über ein Socket, welche ich im Nachhinein auswerten möchte. Dafür gibt es eine API, welche mir diese Daten vom Server holen soll.
Hier mal eine Funktion daraus:
C#-Quellcode
- public event EventHandler MitarbeiterlisteChanged;
- private MitarbeiterCollection _mitarbeiterliste = new MitarbeiterCollection();
- /// <summary>Ruft alle aktiven Mitarbeiter ab.</summary>
- public MitarbeiterCollection Mitarbeiterliste
- {
- get => _mitarbeiterliste;
- private set
- {
- this._mitarbeiterliste = value;
- OnMitarbeiterlisteChanged(EventArgs.Empty);
- }
- }
- private void LadeAktiveMitarbeiter()
- {
- ServerProtokoll<ObjectNachricht> serverProtokoll = new ServerProtokoll<ObjectNachricht>(new ObjectNachricht(ObjektType.MitarbeiterAktiv));
- Mitarbeiter[] result = new Mitarbeiter[] { };
- void handler(object sender, Mitarbeiter[] e)
- {
- result = e;
- ewh.Set();
- }
- GlobaleVariabeln.srv.MitarbeiterReceived += handler;
- serverProtokoll.Send(Connection);
- ewh.WaitOne(Timeout);
- GlobaleVariabeln.srv.MitarbeiterReceived -= handler;
- Mitarbeiterliste = new MitarbeiterCollection(result);
- }
Wenn nun die Mitarbeiter durch einen anderen Client aktualisiert werden, dann sendet der Server automatisch eine neue Nachricht an alle Clienten, die dafür sorgt, dass die Mitarbeiterliste aktualisiert wird. Nun kann es ja vorkommen, dass der Client gerade eine Schleife auf die Liste anwendet.
Typischer Fall wäre hier z.B.
Würde ich nun die Liste ändern, dann würde spätestens jetzt mein Client abstürzen.
Ich könnte nun entweder immer die Liste vorher kopieren, oder mithilfe eines locks blockieren, doch dann müsste ich dies ja an jeder Stelle machen. Gibt es hier eine Möglichkeit das nur an einer Stelle direkt zu ändern? Ich könnte mir die Liste natürlich auch jedes mal vom Server laden lassen, doch das wäre Aufgrund der Größe des Objekts eher suboptimal.
Am besten wäre es, wenn eine Änderung der liste direkt dazu führt, dass aktuell laufende Schleifen quasi wiederholt werden.
Habt Ihr eine Idee, wie sich das am besten realisieren lässt?
LG