Ich kann diesem Fehler nicht auf den Grund gehen, denn wenn der Debugger angeschlossen ist, scheint er nicht aufzutreten.
Sammlung wurde geändert; Aufzählungsoperation darf nicht ausgeführt werden
Nachstehend finden Sie den Code.
Dies ist ein WCF-Server in einem Windows-Dienst. Die Methode NotifySubscribers()
wird vom Dienst immer dann aufgerufen, wenn ein Datenereignis vorliegt (in zufälligen Abständen, aber nicht sehr oft - etwa 800 Mal pro Tag).
Wenn ein Windows Forms-Client ein Abonnement abschließt, wird die Abonnenten-ID zum Abonnentenverzeichnis hinzugefügt, und wenn der Client das Abonnement abbricht, wird sie aus dem Verzeichnis gelöscht. Der Fehler tritt auf, wenn (oder nachdem) ein Client sich abmeldet. Es scheint, dass das nächste Mal, wenn der NotifySubscribers()
Methode aufgerufen wird, wird die foreach()
Schleife schlägt mit dem Fehler in der Betreffzeile fehl. Die Methode schreibt den Fehler in das Anwendungsprotokoll, wie im folgenden Code gezeigt. Wenn ein Debugger angeschlossen ist und ein Kunde sich abmeldet, wird der Code ordnungsgemäß ausgeführt.
Sehen Sie ein Problem mit diesem Code? Muss ich das Wörterbuch thread-sicher machen?
[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]
public class SubscriptionServer : ISubscriptionServer
{
private static IDictionary<Guid, Subscriber> subscribers;
public SubscriptionServer()
{
subscribers = new Dictionary<Guid, Subscriber>();
}
public void NotifySubscribers(DataRecord sr)
{
foreach(Subscriber s in subscribers.Values)
{
try
{
s.Callback.SignalData(sr);
}
catch (Exception e)
{
DCS.WriteToApplicationLog(e.Message,
System.Diagnostics.EventLogEntryType.Error);
UnsubscribeEvent(s.ClientId);
}
}
}
public Guid SubscribeEvent(string clientDescription)
{
Subscriber subscriber = new Subscriber();
subscriber.Callback = OperationContext.Current.
GetCallbackChannel<IDCSCallback>();
subscribers.Add(subscriber.ClientId, subscriber);
return subscriber.ClientId;
}
public void UnsubscribeEvent(Guid clientId)
{
try
{
subscribers.Remove(clientId);
}
catch(Exception e)
{
System.Diagnostics.Debug.WriteLine("Unsubscribe Error " +
e.Message);
}
}
}
0 Stimmen
In meinem Fall war es ein Kollateraleffekt, weil ich einige .Include("table") verwendete, die während des Prozesses geändert wurden - nicht sehr offensichtlich, wenn man den Code liest. Ich hatte jedoch Glück, dass diese Includes nicht benötigt wurden (yeah! alter, nicht gepflegter Code) und ich mein Problem löste, indem ich sie einfach entfernte
0 Stimmen
Bitte sehen Sie sich die Antwort von @joe an. Das ist in vielen Fällen eine viel bessere Lösung. stackoverflow.com/a/57799537/10307728