SORU
3 Mart 2009, Salı


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
3 Mart 2009, Salı


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

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bokeh

    Bokeh

    9 HAZİRAN 2014
  • Google Developers

    Google Devel

    23 AĞUSTOS 2007
  • LearnKey

    LearnKey

    19 AĞUSTOS 2008