SORU
18 Ocak 2013, Cuma


Neden Konularda tavsiye değildir .NET Reaktif Uzantıları?

Şu an için Reaktif Uzantıları çerçeve ile başa alıyorum .NET ve bulduğum çeşitli giriş kaynaklarını (özellikle http://www.introtorx.com) yolumu çalışıyorum

Bizim uygulama içerir sayıda donanım arayüzleri algılamak ağ çerçeveleri, bu olacak benim İObservables, ben daha sonra çeşitli bileşenleri olacak tüketmek bu kareler veya gerçekleştirmek tarz bir dönüşüm verileri ve üretmek, yeni tip bir kare. Ayrıca örneğin her n'inci kareyi görüntülemek için gereken diğer bileşenleri olacak. Rx bizim uygulama için yararlı olacağına inanıyorum, ancak İObserver arayüzü için uygulama ayrıntıları ile mücadele ediyorum.

Çoğu (hepsi değilse de) okuyorum kaynakların uygulayarak uygulanıp system.ıobservable arayüzü kendim uygulamak ama sağlanan işlevleri veya sınıfları birini kullanmam gerektiğini söyledi. Benim araştırma görünen oluşturma Subject<IBaseFrame> isimleri bana ne ihtiyacım var ki benim tek iş parçacığı okuma verilerden donanım arayüzü ve arama fonksiyonu OnNext benim Subject<IBaseFrame> örneği. Farklı İObserver bileşenleri daha sonra bu Konuda kendi bildirimleri alacak.

Benim karışıklık yazan yere this tutorial tavsiye ekte PES geliyor:

Konu türlerini kullanmaktan kaçının. Rx etkili fonksiyonel bir programlama paradigma. Denekler kullanarak zararlı mutasyona olan devlet, idare ediyoruz demektir. Aynı zamanda mutasyona devlet ve asenkron programlama ile uğraşmak çok zor değil mi. Ayrıca, operatörleri (uzatma yöntemleri) dikkatli bir şekilde abonelik ve dizileri doğru ve tutarlı ömür boyu bakım sağlamak için yazılmıştır; konuları tanıtmak, bu zarar verebilir. Gelecek sürümlerde de eğer açıkça konular kullanırsanız, önemli bir performans düşüşü görebilirsiniz.

Benim uygulama oldukça kritik performans, ben açıkçası gidip test performans kullanarak Rx desenleri önce gider için Üretim kodu; ancak ben endişelendiren bir şey yapıyorum yani karşı ruh Rx çerçeve kullanarak Konu sınıf ve bir gelecek hali çerçevesinde olacak zarar performans.

İstediğim şeyi yapmanın daha iyi bir yolu var mı? Donanım yoklama parçacığı herhangi bir gözlemci olup olmadığı sürekli çalışır durumda olacak (DONANIM arabellek aksi takdirde, tekrar yapar, bu çok sıcak bir dizi. Sonra birden çok gözlemci için alınan karelerin geçmek istiyorum.

Herhangi bir tavsiye büyük mutluluk duyacağız.

CEVAP
22 Ocak 2013, Salı


Tamam, Biz dogmatik benim yol yok sayıp "konuları iyi/kötü" hep birlikte. Yoksay Bize sorun alanı inceleyelim.

Sen de nankör gerek sistem 2 stilleri 1 bahse girerim.

  1. Sistem bir olay veya bir mesaj geldiğinde bir ara yükseltir
  2. Sistem işlemeye herhangi bir mesaj olup olmadığını görmek için ankete gerek

Seçeneği için 1, kolay, biz sadece uygun FromEvent yöntemi ile sarın ve işimiz bitti. Bara!

2, Şimdi biz bu effciently nasıl bu anket ve nasıl dikkate almak gerekir için Seçenek. Ayrıca değer vardığımızda, nasıl yayınlamak mı?

Yoklama için adanmış bir iş parçacığı isteyeceğini tahmin ediyorum. Başka bir kodlayıcı Havuzu/TaskPool çekiç ve Havuzu açlık bir durumda bırakmak istemem. Alternatif olarak bağlam anahtarlama (sanırım) güçlük istemiyorum. Varsayalım kendi iş parçacığı var, belki biz oturup bu döngü ankete uyurken bir çeşit olacak. Onay bulduğunda bazı mesajlar yayınlayacak. Bu iyi tüm Gözlemlenebilir için mükemmel görünüyor.Oluşturun. Şimdi biz muhtemelen cant bu alışkanlık bizi hiç iptal izin vermek için bir tek Kullanımlık dönmesine izin olarak While döngüsü kullanın. Neyse ki bütün kitabı okudum bu yüzden Özyinelemeli zamanlama ile sağduyulu!

Bu işe yarayabilir gibi bir şey sanırım. #NotTested

public class MessageListener
{
    private readonly IObservable<IMessage> _messages;
    private readonly IScheduler _scheduler;

    public MessageListener()
    {
        _scheduler = new EventLoopScheduler();

        var messages = ListenToMessages()
                                    .SubscribeOn(_scheduler)
                                    .Publish();

        _messages = messages;
        messages.Connect();
    }

    public IObservable<IMessage> Messages
    {
        get {return _messages;}
    }

    private IObservable<IMessage> ListenToMessages()
    {
        return Observable.Create<IMessage>(o=>
        {
                return _scheduler.Schedule(recurse=>
                {
                    try
                    {           
                        var messages = GetMessages();
                        foreach (var msg in messages)
                        {
                            o.OnNext(msg);
                        }   
                        recurse();
                    }
                    catch (Exception ex)
                    {
                        o.OnError(ex);
                    }                   
                });
        });
    }

    private IEnumerable<IMessage> GetMessages()
    {
         //Do some work here that gets messages from a queue, 
         // file system, database or other system that cant push 
         // new data at us.
         // 
         //This may return an empty result when no new data is found.
    }
}

Genellikle geliştirici bir durum olduğunu gerçekten Konuları sevmiyorum, sebebi gerçekten sorun açık bir tasarıma sahip değil. Bir konuda Hack, burada, orada ve her yerde poke, ve o zavallı destek dev YAPARKEN de tahmin edeyim. Vb yöntemler Üretmek/Oluşturmak kullandığınızda dizide etkileri yerelleştirme. Bu bir yöntem, her şeyi görebilirsiniz ve hiç kimse, bu kötü bir yan etkisi olarak veriyoruz. Eğer konu alanları görürsem ben şimdi kullanılıyor sınıftaki tüm yerler aramaya gitmek zorunda değilsiniz. Eğer bazı MFer bir halka ifşa ederse, tüm bahisler bu dizi nasıl kullanıldığını bilen vardır! Zaman uyumsuz/Eşzamanlılık/Rx zor. Zor yan etkileri ve nedensellik programlama kafanı daha da dönmesine izin vererek yapmanıza gerek yok.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jose LviS el Bambino ( JLB )   LviSito

    Jose LviS el

    3 ŞUBAT 2008
  • BroadCity

    BroadCity

    10 ŞUBAT 2010
  • Dion Coulls

    Dion Coulls

    16 AĞUSTOS 2006