Je ne peux pas aller au fond de cette erreur, car lorsque le débogueur est attaché, il ne semble pas se produire. Ci-dessous est le code.
C'est un serveur WCF dans un service Windows. La méthode NotifySubscribers est appelé par le service chaque fois qu'il ya un événement de données (à des intervalles aléatoires, mais pas très souvent - environ 800 fois par jour).
Lorsqu'un Windows Forms client s'abonne, l'ID de l'abonné est ajouté à tous les abonnés de dictionnaire, et lorsque le client se désinscrit, il est supprimé à partir du dictionnaire. L'erreur se produit lors de la (ou après) une résiliation par le client. Il semble que la prochaine fois que l'NotifySubscribers() la méthode est appelée, la boucle foreach() en boucle échoue avec l'erreur dans la ligne objet. La méthode écrit l'erreur dans le journal des applications comme le montre le code ci-dessous. Lorsqu'un débogueur est attaché et une résiliation par le client, le code s'exécute bien.
Voyez-vous un problème avec ce code? Ai-je besoin de faire le dictionnaire thread-safe?
[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);
}
}
}