SORU
27 Ocak 2010, ÇARŞAMBA


Tek çekim olayları Lambda kullanarak C#

Bu tür şeyler sık sık kendimi yaparken buluyorum:-

 EventHandler eh = null;  //can't assign lambda directly since it uses eh
 eh = (s, args) =>
 {
     //small snippet of code here

     ((SomeType)s).SomeEvent -= eh;
 }
 variableOfSomeType.SomeEvent  = eh;

Ben sadece bir olay bir atışı dinlemek için işleyici eklemek ister temelde, ben artık bundan sonra bağlı kalmak istiyorum. "Kod snippert" sadece bir çizgi vardır. bu genellikle oldukça

Aklım biraz uyuşmuş oluyor, tüm bu yükü tekrar etmeye gerek yok o yüzden yapabileceğim bir şey olmalı eminim. EventHandler EventHandler<T> olabilir unutmayın.

Yukarı kod repeative kısmı düzenli ve sadece bir Lambda içinde parçacık gidebilirim nasıl herhangi bir fikir?

CEVAP
27 Ocak 2010, ÇARŞAMBA


Kalıcı bir olay için olay işleyicisi Ataşesi. Sonra da "tek atış olay işleyicileri" bu dahili bir sıraya eklenir: . çağırır olay işleyicisi

OneShotHandlerQueue<EventArgs> queue = new OneShotHandlerQueue<EventArgs>();

Test test = new Test();

// attach permanent event handler
test.Done  = queue.Handle;

// add a "one shot" event handler
queue.Add((sender, e) => Console.WriteLine(e));
test.Start();

// add another "one shot" event handler
queue.Add((sender, e) => Console.WriteLine(e));
test.Start();

Kod:

class OneShotHandlerQueue<TEventArgs> where TEventArgs : EventArgs {
    private ConcurrentQueue<EventHandler<TEventArgs>> queue;
    public OneShotHandlerQueue() {
        this.queue = new ConcurrentQueue<EventHandler<TEventArgs>>();
    }
    public void Handle(object sender, TEventArgs e) {
        EventHandler<TEventArgs> handler;
        if (this.queue.TryDequeue(out handler) && (handler != null))
            handler(sender, e);
    }
    public void Add(EventHandler<TEventArgs> handler) {
        this.queue.Enqueue(handler);
    }
}

Test sınıf:

class Test {
    public event EventHandler Done;
    public void Start() {
        this.OnDone(new EventArgs());
    }
    protected virtual void OnDone(EventArgs e) {
        EventHandler handler = this.Done;
        if (handler != null)
            handler(this, e);
    }
}

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • MagicofRahat

    MagicofRahat

    13 Temmuz 2007
  • Matt Stokes

    Matt Stokes

    22 Ocak 2008
  • William Hyde

    William Hyde

    23 HAZİRAN 2008