আমি এই ত্রুটির তলটিতে পৌঁছতে পারি না, কারণ যখন ডিবাগারটি সংযুক্ত করা হয় তখন মনে হয় না। নীচে কোড দেওয়া আছে।
এটি একটি উইন্ডোজ পরিষেবাতে একটি ডাব্লুসিএফ সার্ভার। যখনই কোনও ডেটা ইভেন্ট হয় (যখন এলোমেলো বিরতিতে হয়, তবে প্রায়শই প্রায় নয় - প্রতিদিন প্রায় 800 বার) পরিষেবাটি বিজ্ঞপ্তিপ্রাপ্তদের পরিষেবা বলে।
যখন কোনও উইন্ডোজ ফর্ম ক্লায়েন্ট সাবস্ক্রাইব করে, সাবস্ক্রাইবার আইডি সাবস্ক্রাইবার অভিধানে যুক্ত হয় এবং যখন ক্লায়েন্ট সাবস্ক্রাইব করে তখন অভিধান থেকে এটি মুছে ফেলা হয়। ত্রুটি ঘটে যখন (বা পরে) কোনও ক্লায়েন্ট সাবস্ক্রাইব করে। এটি প্রদর্শিত হবে যে পরের বার 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);
}
}
}