我无法深入了解这个错误,因为在附加调试器时,它似乎没有发生。
收藏已修改;枚举操作可能无法执行
下面是代码。
这是 Windows 服务中的 WCF 服务器。只要有数据事件,服务就会调用该方法NotifySubscribers()
(以随机间隔,但不是很频繁 - 每天大约 800 次)。
当 Windows 窗体客户端订阅时,订阅者 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);
}
}
}