मैं इस त्रुटि की तह तक नहीं जा सकता, क्योंकि जब डिबगर संलग्न होता है, तो ऐसा प्रतीत नहीं होता है। नीचे कोड है।
यह एक Windows सेवा में WCF सर्वर है। जब भी कोई डेटा इवेंट (यादृच्छिक अंतराल पर, लेकिन बहुत बार नहीं - प्रति दिन लगभग 800 बार) सेवा द्वारा NotifySubscribers को कॉल किया जाता है।
जब एक विंडोज फॉर्म क्लाइंट सब्सक्राइब करता है, तो सब्सक्राइबर आईडी सब्सक्राइबर डिक्शनरी में जुड़ जाता है, और जब क्लाइंट अनसब्सक्राइब करता है, तो उसे डिक्शनरी से डिलीट कर दिया जाता है। त्रुटि तब होती है जब (या बाद में) एक ग्राहक सदस्यता समाप्त करता है। ऐसा प्रतीत होता है कि अगली बार 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);
}
}
}