我无法弄清此错误的原因,因为在附加调试器后,似乎没有发生此错误。下面是代码。
这是Windows服务中的WCF服务器。每当有数据事件时,服务就会调用NotifySubscribers方法(以随机间隔,但不是很频繁-每天大约800次)。
Windows Forms客户端进行预订时,订户ID被添加到订户字典中,而当客户端取消订阅时,将从该词典中删除它。该错误发生在客户退订时(或之后)。看来,下次调用NotifySubscribers()方法时,foreach()循环会失败,并在主题行中出现错误。该方法将错误写入应用程序日志,如下面的代码所示。当附加了调试器并且客户端取消订阅时,代码将正常执行。
您看到此代码有问题吗?我需要使字典具有线程安全性吗?
[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);
}
}
}