Saya tidak bisa sampai ke bagian bawah kesalahan ini, karena ketika debugger terpasang, sepertinya tidak terjadi. Di bawah ini adalah kode.
Ini adalah server WCF dalam layanan Windows. Metode NotifySubscribers dipanggil oleh layanan setiap kali ada acara data (secara acak, tetapi tidak terlalu sering - sekitar 800 kali per hari).
Ketika klien Windows Forms berlangganan, ID pelanggan ditambahkan ke kamus pelanggan, dan ketika klien berhenti berlangganan, itu dihapus dari kamus. Kesalahan terjadi ketika (atau setelah) klien berhenti berlangganan. Tampaknya kali berikutnya metode NotifySubscribers () dipanggil, loop foreach () gagal dengan kesalahan di baris subjek. Metode menulis kesalahan ke dalam log aplikasi seperti yang ditunjukkan dalam kode di bawah ini. Ketika debugger dilampirkan dan klien berhenti berlangganan, kode dieksekusi dengan baik.
Apakah Anda melihat masalah dengan kode ini? Apakah saya perlu membuat kamus thread-safe?
[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);
}
}
}