Domanda

La mia classe C# deve essere in grado di elaborare un volume elevato di eventi ricevuti tramite una connessione socket in stile flusso TCP.Il volume dei messaggi di evento ricevuti dal server TCP dal socket della classe è completamente variabile.Ad esempio, a volte riceverà solo un messaggio di evento in un periodo di dieci secondi e altre volte riceverà sessanta messaggi di evento in un secondo.

Sto utilizzando Socket.ReceiveAsync per ricevere messaggi.ReceiveAsync restituisce true se l'operazione di ricezione è in sospeso o false se sono già presenti dati in transito e l'operazione di ricezione è stata completata in modo sincrono.Se l'operazione è in sospeso, Socket chiamerà la mia richiamata su un thread di completamento IO, altrimenti chiamo la mia richiamata nel thread corrente (IOC).Inoltre, insieme ai messaggi di evento, ricevo anche risposte ai comandi inviati a questo server TCP.I messaggi di risposta vengono elaborati immediatamente;individualmente, licenziando un lavoratore del threadpool.

Tuttavia, vorrei mettere in coda i messaggi di evento finché non ne avrò "abbastanza" (N) OPPURE finché non ce ne saranno più in rete... e quindi licenziare un lavoratore del pool di thread per elaborare un batch di messaggi di evento.Inoltre, voglio che tutti gli eventi vengano elaborati in sequenza, quindi voglio che solo un lavoratore del pool di thread lavori su questo alla volta.

Il processore dei messaggi di evento deve solo copiare il buffer dei messaggi in un oggetto, generare un evento e quindi rilasciare nuovamente il buffer dei messaggi nel pool del buffer ad anello.Quindi la mia domanda è...quale pensi sia la migliore strategia per raggiungere questo obiettivo?

Hai bisogno di maggiori informazioni?Fammi sapere.Grazie!!

È stato utile?

Soluzione

Non definirei 60 eventi al secondo ad alto volume.A quel basso livello di attività qualsiasi metodo di elaborazione del socket andrà bene.Ho gestito 5.000 eventi al secondo su un singolo thread utilizzando hardware molto meno potente delle macchine attuali, utilizzando semplicemente la selezione.

Dirò che se stai cercando di espandersi, distribuire i messaggi individualmente tra i thread sarà un disastro.È necessario eseguire il batch altrimenti i cambi di contesto ridurranno le prestazioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top