2010-05-05 8 views
12

Ich schreibe eine stark asynchrone Anwendung.Queuing Methodenaufrufe - eine Idee wie?

Ich bin auf der Suche nach einer Möglichkeit, Methodenaufrufe zu Warteschlange, ähnlich wie BeginInvoke/EndInvoke tut .... aber in meiner eigenen Warteschlange. Der Grund dafür ist, dass ich mein eigenes optimiertes Nachrichtenwarteschlangensystem unter Verwendung eines Threadpools habe, aber gleichzeitig sicherstelle, dass jede Komponente in den Anforderungen single threaded ist (d. H. Ein Thread behandelt nur Nachrichten für eine Komponente).

Ich habe eine Menge Nachrichten hin und her. Für begrenzte Verwendung würde ich wirklich lieben, in der Lage zu sein, einen Nachrichtenaufruf nur mit Parametern einzuordnen, anstatt meinen eigenen Parameter, das Verpacken/Auspacken der Methode nur zu definieren, um viele administrative Anrufe zu tun. Ich will auch nicht immer die Warteschlange umgehen, und ich möchte definitiv nicht, dass der sendende Dienst darauf wartet, dass der andere Dienst antwortet.

Wer weiß, wie man einen Methodenaufruf abfängt? Eine Möglichkeit, TransparentProxy/Virtual Proxy dafür zu nutzen? ;) ServicedComponent? Ich möchte das so wenig Overhead wie möglich sein;)

Antwort

13

Wie wäre es mit Lambdas?

Ich meine, warum nicht Sie einige Queue erstellen und diese in einer Weise verarbeiten wie

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

Sie Aktionen einfach sehr hinzufügen:

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

Dies ist nur ein Tipp, ich Ich bin mir nicht sicher, ob es eine Queue-Klasse gibt, aber es sollte ziemlich einfach sein, selbst eine (und threadsafe!) zu erstellen.

Der Workaround könnte (und sollte) viel klüger sein, aber der Hauptpunkt ist da. Schreiben Sie mir, wenn Sie sich beraten lassen wollen.

Pz, der TaskConnect Entwickler

+0

TGhe Warteschlange ist nicht das Problem;) Ich habe, dass man bereits, und ein Viele Nachrichten, die Datenaktualisierungen transportieren. Mein Problem sind nur Funktionsaufrufe. Die Warteschlange verwendet dann einen ThreadPool, um einen Worker-Thread zu erhalten, der seinen Inhalt verarbeitet;) Ich habe viele Cross-Prozess-Daten-Update-Sachen dort - jetzt suche ich nach einer Möglichkeit, (Prozess-) Queue-Methodenaufrufe. Ein Nachrichtentyp, der keine "Daten" enthält, sondern einen Funktionsaufruf mit allen Parametern, so dass ich die Aufrufmethoden für den Zieldienst verwenden kann. Dies würde die Anzahl der verschiedenen Nachrichten, die ich brauche, erheblich reduzieren ... – TomTom

+0

und ich hätte keine große Switch-Anweisung, nur um verschiedene Methoden aufzurufen. – TomTom

+0

Da Sie versuchen, Inprozess-Methodenaufrufe in die Warteschlange zu stellen, scheint das Übergeben von Lambda genau das zu sein, wonach Sie suchen ... –

1

Die Dynamic, die einen Teil des Schlosses Projekt ist erlaubt Objektelement Abfangen ohne einige der typischen Rangierung Schmerz

http://www.castleproject.org/projects/dynamicproxy/

Sie könnten so Ihre Methoden abfangen anrufe und mache dann mit ihnen was du willst.

2

eine Warteschlange von

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

späteren Artikel zu Ihrer Queue

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

Dann rufen Sie Ihre Funktionen einen nach dem anderen hinzufügen:

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

alle Ihrer anrufen Funktionen auf eine sichere Weise (dies wird auch sie alle aus der Warteschlange entfernen die Warteschlange leer und alle Funktionen verlassen s genannt)

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 

    } 
} 

sie nennen alle nur InvokeAll(); verwenden oder eine eine Zeit zu rufen, wann immer Sie wollen:

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. 
     } 
} 
Verwandte Themen