Esiste uno schema per iscriversi a eventi / messaggi infornati a intervalli specifici?

2

Non sono sicuro se questo sia uno scenario comune o no, ma ho bisogno di seguire le seguenti linee:

Ho un oggetto (lo chiamerò nodo) e questo oggetto ha metodi X, Y e Z. Voglio essere in grado di ricevere notifiche ai sottoscrittori se i metodi sono chiamati in un ordine specifico con un tempo specifico ( un intervallo di tempo sarebbe l'ideale). Ad esempio:

  1. Node.X () viene chiamato
  2. Node.Z () è chiamato da 5 a 7 millisecondi ultimi
  3. Node.X () viene chiamato da 1 a 2 millisecondi dopo quello
  4. Node.Y () viene chiamato 2 millisecondi secondi dopo.
  5. Infine, viene attivato un evento che chiama un iscritto a questa sequenza.

Ora, in questo esempio sto semplicemente usando metodi senza parametri, ma nella vita reale avrei bisogno di essere più specifico sui contenuti dei parametri (cercherò messaggi specifici).

Per riferimento sto usando C # .net 4.

Ci sono quadri / schemi / librerie esistenti là fuori che sono costruiti per fare questo?

    
posta aceinthehole 03.10.2011 - 16:30
fonte

4 risposte

4

Non conosco un framework o una libreria in grado di gestire questo fuori dagli schemi, ma una soluzione al problema è l'implementazione di una macchina a stati finiti per la generazione di eventi. Come suggerisce il tuo esempio, l'FSM ha 5 stati. Le transizioni da i a i + 1 sono le tue condizioni nella tua lista. Ogni volta che viene chiamata una funzione del nodo, è possibile passare l'evento all'FSM e verificare se la condizione per lo stato i è soddisfatta e regolare lo stato di conseguenza (condizione detiene = > passare allo stato i + 1; altrimenti andare per dichiarare 1). Se raggiungi lo stato 5, emetti un evento e torna allo stato 1.

Ad esempio, se si è nello stato 3 e si riceve EVENT_X_CALLED , si controlla l'ora corrente e la si confronta con il tempo di transizione. Se è compreso tra 1 e 2 ms, cambia lo stato in 4. In caso contrario, torna allo stato 1.

    
risposta data 03.10.2011 - 17:04
fonte
3

Ho usato Microsoft PRISM EventAggregator o MVVM Light's Messenger per sistemi di messaggi come questo, e suppongo che tu abbia una classe che si iscriva a tutti e 3 gli eventi e li instradi allo stesso metodo.

In questo metodo, controlla il messaggio e vedi se è il primo tipo a cui è interessato il gestore. Se sì, imposta un flag e un timer (opzionale) e aspetta quello successivo. Quando si riceve il 2 ° evento, controllare se l'ultimo evento ricevuto è stato Evento 1 e, in tal caso, impostare l'ultimo Evento ricevuto su Evento2 e resettare nuovamente il timer. Ripeti fino a quando non ottieni tutti gli eventi, quindi elabora.

Ecco un esempio approssimativo:

public MyClassConstructor()
{
    eventAggregator.Subscribe<EventX>(ProcessEvents);
    eventAggregator.Subscribe<EventY>(ProcessEvents);
    eventAggregator.Subscribe<EventZ>(ProcessEvents);
}

private int eventCount = 0;
void ProcessEvents(object e)
{
    if ((e is EventX && eventCount == 0)
        || (e is EventZ && eventCount == 1)
        || (e is EventX && eventCount == 2)
    {
        eventCount++;
        // optionally start/reset timer which sets eventCount = 0
    }
    else if (e is EventY && eventCount == 3)
    {
        // Execute code
        eventCount = 0;
    }
}

Ogni Node.Method sarebbe responsabile per l'attivazione di un messaggio di evento con parametri basati su quale metodo è stato eseguito

eventAggregator.Publish<EventX>(new EventX(params));
    
risposta data 03.10.2011 - 17:33
fonte
1

.NET (e in definitiva, fuori dalla finestra di Windows) potrebbe non essere la scelta migliore per questo.

Tutti gli eventi avranno una notevole quantità di spazio di manovra quando vengono indirizzati dal sistema operativo questo thread SO entra in un po 'di background.

    
risposta data 03.10.2011 - 18:49
fonte
1

È possibile utilizzare Reactive Extensions per .NET per implementare lo scenario che descrivi. Puoi pensare a loro come "LINQ agli eventi". Dai un'occhiata agli esempi .

    
risposta data 13.10.2011 - 07:58
fonte

Leggi altre domande sui tag