最佳答案
我无法了解此错误的底部,因为当调试器附加时,它似乎不会发生。
集合已修改;枚举操作可能无法执行
下面是代码。
这是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);}}}