2012-04-23 3 views
6

Ho incontrato .NET2 ThreadLocal<T> e mi chiedevo se c'è un modo per accumulare i valori .Value da tutti i thread.Come si combinano i valori di una variabile ThreadLocal <T>?

Nella libreria cpl di Microsoft ppl hanno Concurrency::combinable::combine_each, esiste un metodo equivalente per .NET ThreadLocal?

ThreadLocal<long> ticks = new ThreadLocal<long>(); 

void AddTicks(StopWatch sw) 
{ 
    ticks.Value += sw.ElapsedTicks; 
} 

void ReportTimes() 
{ 
    long totalTicks = /* How do I accumulate all the different values? */; 
    Console.WriteLine(TimeSpan.FromTicks(totalTicks)); 
} 

risposta

2

Dal .Net 4.5, Microsoft ha aggiunto un attributo chiamato Values alla classe ThreadLocal che fa esattamente quello che ti serve. Qui di seguito troverete il modo in cui funziona:

var localResult = new ThreadLocal<int>(() => 0, trackAllValues: true); 
Parallel.For(0, 10000, i => 
{ 
    localResult.Value += Compute(i); 
}); 

int result = localResult.Values.Sum(); 

Il codice di cui sopra è stato ottenuto dal post sul blog http://blogs.msdn.com/b/pfxteam/archive/2011/11/11/10236000.aspx

+2

Puoi modificare questo per avere un esempio di come si può usare il nuovo attributo per risolvere il problema? Penso che questa sia una buona informazione, ma un po 'scarsa. Più dettagli sarebbero davvero utili a qualcuno che viene in SO. –

Problemi correlati