private void Timer_Elapsed(object sender, ElapsedEventArgs e) { TimeServerEventArgument argument = new TimeServerEventArgument(DateTime.Now); // Crude, but works lock (SyncRoot) { // Temp. Listen-Kopie erzeugen mit ToList() und diese abarbeiten foreach (ITimerCallback proxy in ClientCallbacks.ToList()) { try { proxy.ServerCallback(Environment.MachineName, argument); } catch { // Fehlerhafte aus Original Liste löschen ClientCallbacks.Remove(proxy); // Eigenes lock für diese Methode auch möglich // Weitere Möglichkeit: // 2. Liste mit Fehlerhaften Clients aufbauen, nachher aus Orig.-Liste löschen } } } }
private void TimerCallback_Tick(object sender, TimeServerEventArgument e) { CurrentTime = e.CurrentTime.ToLongTimeString(); PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(CurrentTime))); }