2010-05-05 10 views
12

Çok sık rastlanmayan bir uygulama yazıyorum.Kuyrukta yöntem çağrıları - herhangi bir fikir nasıl?

BeginInvoke/EndInvoke'un yaptığı gibi, yöntem çağrılarını kuyruğa almanın bir yolunu arıyorum .... ama benim KWN sırasına. Reaqson, bir threadpool kullanarak kendi optimize edilmiş mesaj kuyruklama sistemime sahip olduğumu fakat aynı zamanda her bileşenin isteklerde tek bir şekilde işlendiğinden emin olmaktır (yani, bir iş parçacığı yalnızca bir bileşenin iletilerini işliyor).

Çok sayıda iletinin ileri ve geri gitmesini sağlayın. Sınırlı kullanım için, sadece çok fazla admnistrative çağrı yapmak için kendi parametremi, metot sarma/açma metodunu tanımlamak yerine, sadece bir mesaj çağrısını parametrelerle sıraya sokmayı çok isterim. Ayrıca her zaman kuyruğu atlamak istemiyorum ve gönderen hizmetin diğer hizmetin yanıt vermesini beklemesini istemiyorum.

Herkes, yöntem çağrısını engellemenin bir yolunu biliyor mu? Bunun için TransparentProxy/Virtual Proxy kullanmanın bir yolu var mı? ;) ServicedComponent? Bunun olabildiğince küçük bir yük olmasını isterim;)

cevap

13

Lambdalar nasıl kullanılır? Ben,

Queue.Add(()=>{ /* any code you wish here */}) 

Bu sadece bir ipucu: Demek

, neden bazı Kuyruk oluşturmaz, ve Çok basit eylemler ekleyebilir

while (!queue.Empty) 
{ 
    Action action = queue.Pop(); 
    action(); // this calls your action 
} 

gibi bir şekilde onları işlemek Bazı Queue sınıfları olup olmadığından emin değilim, ancak kendiniz bir tane (ve threadafe!) oluşturmak oldukça kolay olmalıdır.

Çözüm, daha akıllı olabilir (ve olmalıdır), ancak ana nokta var. Danışmak isterseniz bana yazın.

Pz, TaskConnect geliştirici

+0

TGhe kuyruk sorun değildir; ı var) zaten bir ve bir o veri güncellemelerini taşıyan mesajların çoğu. Sorunum sadece işlev çağrıları. Sıra, daha sonra iş parçacığı içeriğine işleyen bir iş parçacığı almak için bir ThreadPool kullanır;) Orada çok sayıda çapraz işlem veri güncelleme şeyler var - şimdi sırayla (işlenir) yöntem çağrıları için bir yol arıyorum. "Parametre" olmayan, ancak tüm parametrelerle bir işlev çağrısına sahip olan bir mesaj türü, bu yüzden hedef serviste çağrı yöntemlerini basitleştirebilirim. Bu, ihtiyacım olan farklı mesajların sayısını önemli ölçüde azaltacaktır ... – TomTom

+0

ve sadece farklı yöntemleri çağırmak için bir hugh anahtar deyimi ile gelmek zorunda kalmazdım. – TomTom

+0

Süreç içinde yöntem çağrıları aradığınıza göre, lambda'ları geçmek tam olarak aradığınız şey gibi görünüyor ... –

2

bir anda fonksiyonları birini çağırmak ilerleyen MethodInvoker en

Queue<MethodInvoker> EventCall = new Queue<MethodInvoker>(); 

bir kuyruk oluşturma Kuyruk'taki Sonra

EventCall.Enqueue(ClearAllVals); 
EventCall.Enqueue(saystuff); 
EventCall.Enqueue(testFunc); 

öğeler eklemek: Tüm çağırmak için

MethodInvoker bb = EventCall.Dequeue(); 
bb(); 
bb = EventCall.Dequeue(); 
bb(); 
bb = EventCall.Dequeue(); 
bb(); 

senin güvenli bir şekilde işlev yapar (bu aynı zamanda tümünü kuyruktan boş bırakarak ve tüm işlevi kaldırarak kaldırır Sadece InvokeAll(); kullanabilir veya istediğiniz zaman zaman birini onları aramaya hepsini çağırmak)

public bool InvokeAll(){ 
    MethodInvoker bb = null; // this will hold the function prior to use 
    for(int i = 0; i<EventCall.count; i++){ 

     bb = EventCall.Dequeue(); //pull a method off of the queue 
     bb(); //call the method you pulled off of the queue 

    } 
} 

denir:

public bool NextEvent(){ 
    MethodInvoker bb = null; // this will hold the function prior to use 
    if(EventCall.count > 0){ 

     bb = EventCall.Dequeue(); //pull a method off of the queue 
     bb(); //call the method you pulled off of the queue 

     } else { 
     MessageBox.Show("there was no event to call"); // this is optional, point being you should be handeling the fact that there is no events left in some way. 
     } 
} 
İlgili konular