2012-12-26 20 views
5

supponiamo di avere:eventi e filettatura

ethernet_adapter.PacketArrived += (s, e) => 
{ 
    //long processing... 
}; 

elaborazione può richiedere molto tempo e mentre era in mezzo un altro pacchetto è arrivato. Cosa succede dopo: l'elaborazione viene eseguita e poi viene generato un altro evento o forse viene immediatamente generato un nuovo evento ma su una nuova discussione?

+0

Che tipo di oggetto è 'ethernet_adapter'? –

+0

@JimMischel è un tipo di libreria di terze parti 'ICaptureDevice'. Penso di avere la risposta. – ren

risposta

2

Non si dovrebbe assumere. Potrebbe essere qualsiasi cosa a seconda di come l'evento viene generato dal tipo (dell'oggetto ethernet_adapter).

Se è un'operazione sincrona, il nuovo evento non verrà generato fino a quando l'operazione corrente non è in corso.

Se è un'operazione asincrona, il nuovo evento verrà generato immediatamente.

2

È probabile che si tratti di un'operazione sincrona. L'unico modo in cui succederà su un altro thread è se l'oggetto che genera l'evento lo fa su un altro thread o se lo fai nel gestore. Esistono numerosi modi per farlo, ma l'utilizzo di System.Threading.Tasks.Task è generalmente preferibile se si utilizza .NET 4.

Considerare attentamente come si desidera che l'applicazione si comporti. L'elaborazione di ciascun pacchetto su un nuovo thread potrebbe causare la gestione dei pacchetti in ordine. Potresti voler metterli in coda e avere un thread in background per gestirli a quel punto. Oppure potresti non aver bisogno di fare nulla.

0

è possibile accodare l'intera attività in ThreadPool come segue.

ethernet_adapter.PacketArrived += (s, e) => 
{ 
ThreadPool.QueueUserWorkItem("long processing item"); 
}; 

oppure è possibile creare attività (.net 4.0) per ogni thread.

+0

Com'è correlato alla domanda OP? – Tilak

+0

ogni elemento di elaborazione lungo può essere accodato nel threadpool e verrà servito di conseguenza. Spero di aver compreso il problema. – paritosh

+0

Penso che la domanda sia "qual è il comportamento" e non "come eseguire la gestione asincrona" – Tilak

0

Presumibilmente c'è un metodo nella classe ethernet_adapter:

protected virtual void OnPacketArrived(PacketArrivedEventArgs e) 
{ 
    EventHandler<PacketArrivedEventArgs> handler = this.PacketArrived; 

    if (handler != null) 
    { 
     handler(this, e); 
    } 
} 

Finché elaborazione abbonato sincrona (come nel tuo esempio) potrebbe bloccare l'enumerazione interno nel corso tutti gli abbonati. MA! Non può bloccare le chiamate successive a OnPacketArrived se ethernet_adapter lo richiama su un thread diverso ogni volta, in modo da ottenere due elaborazioni concomitanti e così via.

Ad esempio, dare un'occhiata all'implementazione di Socket: i suoi metodi asincroni richiedono il rich