2012-04-23 8 views
6

Przebiegłem przez .NET4's ThreadLocal<T> i zastanawiałem się, czy istnieje sposób gromadzenia wartości .Value ze wszystkich wątków.Jak połączyć wartości ze zmiennej ThreadLocal <T>?

W bibliotece Microsoft ppl C++ mają one Concurrency::combinable::combine_each, czy istnieje odpowiednik metody .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)); 
} 

Odpowiedz

2

Od .Net 4.5 microsoft dodał atrybut o nazwie Values do klasy ThreadLocal, która robi dokładnie to, czego potrzebujesz. Poniżej znajduje się sposób to działa:

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

int result = localResult.Values.Sum(); 

Powyższy kod uzyskano z blogu http://blogs.msdn.com/b/pfxteam/archive/2011/11/11/10236000.aspx

+2

można edytować to mieć przykład jak można korzystać z nowego atrybutu, aby rozwiązać ten problem? Myślę, że to dobra informacja, ale trochę skąpa. Więcej szczegółów byłoby naprawdę pomocne dla kogoś przychodzącego do SO. –