2010-05-05 13 views
12

Piszę bardzo asynchroniczną aplikację.Wywołania metod kolejkowania - jakikolwiek pomysł?

Szukam sposobu kolejkowania wywołań metod podobnych do tego, co robi BeginInvoke/EndInvoke .... ale w mojej kolejce WŁASNEJ. Reaqson polega na tym, że posiadam własny zoptymalizowany system kolejkowania komunikatów za pomocą wątku, ale jednocześnie upewniając się, że każdy komponent jest pojedynczy wątek w żądaniach (tj. Jeden wątek obsługuje tylko wiadomości dla komponentu).

Mam wiele wiadomości wracających do poprzedniej wersji. Do ograniczonego użytku bardzo chciałbym móc ustawić kolejkę komunikatów z parametrami, zamiast definiować własny parametr, zawijanie/rozpakowywanie metod tylko w celu wykonywania wielu połączeń admnistracyjnych. Nie zawsze też chcę ominąć kolejkę i zdecydowanie nie chcę, aby usługa wysyłająca oczekiwała na odpowiedź drugiej usługi.

Ktoś wie o sposobie przechwycenia wywołania metody? Jakiś sposób wykorzystania do tego celu TransparentProxy/Virtual Proxy? ;) ServicedComponent? Chciałbym, żeby to było tak mało jak to możliwe;)

Odpowiedz

13

Co powiesz na używanie lambdas?

To znaczy, dlaczego nie można stworzyć jakiś kolejki i przetwarzać je w sposób jak

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

Możesz dodać działania w bardzo prosty sposób:

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

To tylko wskazówka, ja nie jestem pewien, czy istnieje jakaś klasa Queue, ale powinno być całkiem proste stworzenie jej (i Threadafe!) samodzielnie.

Obejście problemu może (i powinno) być o wiele mądrzejsze, ale najważniejsze jest. Napisz do mnie, jeśli chcesz się skonsultować.

Pz, deweloper TaskConnect

+0

tghe kolejkowania nie jest problem;) Mam że jeden już, a wiele wiadomości, które przenoszą aktualizacje danych. Mój problem to tylko wywołania funkcji. Kolejka następnie używa ThreadPool, aby uzyskać wątek roboczy, który przetwarza jego zawartość;) Mam tam dużo aktualizacji danych procesowych - teraz szukam sposobu na wywołanie kolejki (w procesie). Jeden typ komunikatu, który nie ma "danych", ale wywołanie funkcji ze wszystkimi parametrami, dzięki czemu mogę w prosty sposób wywoływać metody w docelowej usłudze. Znacząco ograniczyłoby to liczbę różnych wiadomości, których potrzebuję ... – TomTom

+0

i nie musiałbym wymyślać instrukcji przełączania hugh wyłącznie w celu wywoływania różnych metod. – TomTom

+0

Ponieważ szukasz w kolejce wywołania metod w procesie, przekazywanie lambdas wydaje się dokładnie tym, czego szukasz ... –

1

DynamicProxy który jest częścią projektu Castle pozwala państwom obiekt przechwycenia bez niektórych z typowym bólem rozrządowych

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

Można to wykorzystać do przechwytywania swoje metody dzwoni, a następnie robi z nimi to, co chcesz.

2

Utwórz kolejkę MethodInvoker za

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

Później dodać elementy do kolejki

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

następnie wezwać funkcje po jednym na raz:

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

nazwać wszystkie swoje działa w bezpieczny sposób (to również usunie je wszystkie z kolejki, pozostawiając pustą kolejkę i całą tę funkcję Nazywa)

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 

    } 
} 

ich wszystkich nazwać po prostu użyć InvokeAll(); lub zadzwonić do nich jeden czas, kiedy chcesz:

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. 
     } 
} 
Powiązane problemy