Ho un'applicazione a processo singolo a due thread. Thread 1 ascolterà un feed di dati di mercato e aggiornerà la quotazione più recente su migliaia di azioni. Il thread 2 eseguirà un timer a una frequenza di campionamento e scatta un'istantanea delle quotazioni più recenti per l'elaborazione. In effetti, ho bisogno di eseguire il down-campionamento di un feed di dati di mercato estremamente veloce.Che cos'è un modo veloce, efficiente per la memoria, di passare i dati tra i thread in C#?
La mia prima ipotesi su una soluzione è utilizzare un BlockingQueue. Per fare questo ho bisogno di spostare la funzionalità del timer in Thread 1, cosa che posso fare controllando l'orologio ogni volta che arriva un aggiornamento di quota e inviare un'istantanea delle virgolette sulla coda alla frequenza di campionamento. La mia preoccupazione qui è che la coda consumerà molta memoria e la garbage collection rallenterà le cose.
La mia seconda ipotesi è quella di fare in modo che il Thread 1 copi i dati in un membro bloccato alla frequenza di campionamento, a cui può accedere il Thread 2. La mia preoccupazione qui è che le serrature saranno lente.
Il mio thirt lo indovina per rendere volatile la citazione primitiva. Poiché un solo thread scrive e un solo thread legge, forse questo è appropriato?
Esiste un modo migliore di comunicare i dati tra i thread per questa applicazione sensibile alla latenza? Questa non è un'applicazione ad altissima frequenza. Riesco a tollerare le latenze dell'ordine di decine di ms.
Avete richiesto il blocco della lettura entrambi i tempi (lettura/scrittura)? :) –
@AmarPalsapure Grazie, errore di battitura fisso! –
Thx per la tua risposta. Proverò le serrature per iniziare. Cosa ne pensi dell'uso volatile? –