如何组合ThreadLocal <T>变量的值?

Mot*_*tti 6 .net c# multithreading .net-4.0

我遇到了.NET4,ThreadLocal<T>并且想知道是否有办法累积.Value所有线程的值.

在微软的ppl C++库中Concurrency::combinable::combine_each,有没有一种与.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));
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*ven 5

这个信息是不可用的.微软正在考虑增加这样的功能.您需要编写一个包装器ThreadLocal<T>来添加此行为.

这是一篇博客文章,提供了有关如何编写包装器的一些说明.


小智 5

由于.NET 4.5,微软添加称为属性ValuesThreadLocal,做正是你需要的类。这是它的工作方式:

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

int result = localResult.Values.Sum();
Run Code Online (Sandbox Code Playgroud)

上面的代码是从博客文章中获得的:.NET 4.5 中的新内容:ThreadLocal.Values