2015-04-22 17 views
8

Possiedo un server Web C# che ho utilizzato per la creazione di profili utilizzando il miniprofiler StackOverflow. Poiché non è un server ASP.NET, ma ogni richiesta è stata in genere eseguita sul proprio thread, ho truccato il miniprofiler per utilizzare lo storage ThreadStatic per tenere traccia di tutti i profiler di una richiesta in arrivo dall'inizio alla fine. Questo ha funzionato bene.Passaggio di dati tra thread ThreadPool

Recentemente abbiamo convertito tutto per utilizzare async/await, il che significa continuazioni dopo un await in genere non tornano sulla stessa Thread e quindi la memorizzazione ThreadStatic non funziona più.

Qual è il modo migliore per passare alcuni piccoli dati tra diversi thread ThreadPool in questo caso? Esistono implementazioni SynchronizationContext che potrebbero essere utili per qualcosa di simile?

+0

Quale versione del framework stai usando? –

+0

Mi dispiace, avrei dovuto dirlo. Sto lavorando con 4.5. – Cuthbert

risposta

8

Qual è il modo migliore per passare alcuni piccoli dati tra thread ThreadPool diversi in questo caso?

Utilizzo del contesto di chiamata logica tramite la classe CallContext. Espone due metodi statici: LogicalSetData e LogicalGetData. Il contesto di chiamata viene memorizzato e marshalling tramite il ExecutionContext, che è anche responsabile del contesto di sincronizzazione, ecc

Utilizzando questa classe ha due limitazioni:

  1. si è limitato all'uso di. NET 4.5 e successivo

  2. Il contesto di chiamata logica utilizza semantica copy-on-write ed esegue una copia superficiale una volta che i dati sono stati modificati. Ciò significa che dovresti utilizzare solo dati immutabili, poiché i riferimenti potrebbero essere condivisi su più thread.

Un'ultima cosa da notare è che CallContext viene inizializzato solo dopo averlo chiamato. Ciò significa che quando lo si utilizza, si sta verificando un sovraccarico a causa della copia su scrittura.

Altro su che possono essere trovati in un post da Stephan Cleary chiamato Implicit Async Context

+3

Esattamente quello che stavo cercando, grazie. – Cuthbert

+0

@Cuthbert Felice di aiutare. –

+0

Grazie per aver sottolineato la copia superficiale e il requisito dei dati immutabili. – angularsen

Problemi correlati