Ich kann diesem Fehler nicht auf den Grund gehen, denn wenn der Debugger angehängt ist, scheint er nicht aufzutreten. Unten ist der 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 Intervallen, aber nicht sehr oft - ungefähr 800 Mal pro Tag).
Wenn ein Windows Forms-Client abonniert, wird die Abonnenten-ID zum Abonnentenwörterbuch hinzugefügt, und wenn der Client sich abmeldet, wird sie aus dem Wörterbuch gelöscht. Der Fehler tritt auf, wenn (oder nachdem) sich ein Client abmeldet. Es scheint, dass beim nächsten Aufruf der NotifySubscribers () -Methode die foreach () -Schleife mit dem Fehler in der Betreffzeile fehlschlägt. Die Methode schreibt den Fehler wie im folgenden Code gezeigt in das Anwendungsprotokoll. Wenn ein Debugger angehängt ist und ein Client sich abmeldet, wird der Code ordnungsgemäß ausgeführt.
Sehen Sie ein Problem mit diesem Code? Muss ich das Wörterbuch threadsicher 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);
}
}
}