Non riesco ad arrivare in fondo a questo errore, perché quando il debugger è collegato, sembra che non si verifichi. Di seguito è riportato il codice.
Questo è un server WCF in un servizio Windows. Il metodo NotifySubscribers viene chiamato dal servizio ogni volta che si verifica un evento di dati (a intervalli casuali, ma non molto spesso - circa 800 volte al giorno).
Quando un client Windows Form si abbona, l'ID abbonato viene aggiunto al dizionario degli abbonati e quando il client annulla l'iscrizione, viene eliminato dal dizionario. L'errore si verifica quando (o dopo) un client annulla l'iscrizione. Sembra che alla successiva chiamata del metodo NotifySubscribers (), il ciclo foreach () fallisce con l'errore nella riga dell'oggetto. Il metodo scrive l'errore nel registro dell'applicazione come mostrato nel codice seguente. Quando un debugger è collegato e un client annulla l'iscrizione, il codice viene eseguito correttamente.
Vedi un problema con questo codice? Devo rendere il dizionario 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);
}
}
}