Koleksiyon; işlem olmayabilir numaralandırma değiştirildi
Hata ayıklayıcı ekli olduğunda, gerçekleşecek gibi görünmüyor çünkü bu hata altına alınamıyor. Aşağıdaki kodu.
Bu bir Windows hizmeti olarak XML sunucusu. Bu yöntem, verileri bir olay olduğunda servis tarafından verilir (günde rasgele aralıklarla, ama çok sık - 800 defa) NotifySubscribers.
Windows Forms istemci abone, abone KİMLİĞİ sözlük aboneler eklenir ve istemci üyelikten çıktığında, sözlükten silinir. Bu hata, bir istemci üyelikten çıktığında (ya sonra) olur. Bir dahaki sefere bu NotifySubscribers görünür() yöntemi çağrılır, foreach() döngü konu satırında hata ile başarısız olur. Yöntemi kodunu aşağıda gösterildiği gibi uygulama günlüğüne hata yazıyor. Bir hata ayıklayıcı ekli ve bir istemci üyelikten çıktığında, kodu daha iyi çalışır.
Bu kod ile ilgili bir sorun görüyor musunuz? Sözlük güvenli iş parçacığı yapmam gerekiyor?
[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);
}
}
}
CEVAP
Olay büyük olasılıkla ne SignalData dolaylı olarak döngü sırasında kaputun altında aboneleri sözlük değişen ve o mesaja yönlendiriyor. Değiştirerek bunu doğrulayabilirsiniz
foreach(Subscriber s in subscribers.Values)
İçin
foreach(Subscriber s in subscribers.Values.ToList())
Eğer haklıysam, sorun kaybolur

Daha önce bir şey yineleme zaman bu ko...
Sözlük için bir koleksiyon başlatıcı&l...
Python turşu hata Çoklu işlem...
Nasıl Nginx üzerinde Ağ herhangi bir i...
Neden döküm geçersiz numaralandırma de...