Hata ayıklayıcı eklendiğinde, bu görünmüyor çünkü bu hatanın altına alamıyorum. Kod aşağıdadır.
Bu, bir Windows hizmetindeki bir WCF sunucusudur. NotifySubscribers yöntemi, bir veri olayı olduğunda (rastgele aralıklarla, ancak çok sık değil - günde yaklaşık 800 kez) hizmet tarafından çağrılır.
Bir Windows Forms istemcisi abone olduğunda, abone kimliği abone sözlüğüne eklenir ve istemci aboneliği iptal ettiğinde sözlükten silinir. Hata, bir istemci aboneliğini iptal ettiğinde (veya sonrasında) oluşur. NotifySubscribers () yöntemi bir sonraki çağrıldığında, foreach () döngüsü konu satırındaki hatayla başarısız olur. Yöntem, hatayı aşağıdaki kodda gösterildiği gibi uygulama günlüğüne yazar. Bir hata ayıklayıcı iliştirildiğinde ve istemci aboneliği iptal ettiğinde, kod iyi yürütülür.
Bu kodla ilgili bir sorun görüyor musunuz? Sözlüğü iş parçacığı için güvenli hale getirmem gerekir mi?
[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);
}
}
}