如何组合一个ThreadLocal<T>的所有值?

问题描述 投票:7回答:2

我遇到了.NET 4的 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));
}
c# .net multithreading .net-4.0
2个回答
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();

上面的代码是从博文中获得的。.NET 4.5中的新功能:ThreadLocal.Values。


4
投票

此信息在.NET 4.0中不可用。对于4.5及以上版本,请参阅Joao的回答。

微软是 考虑增加这样的功能. 你需要在 ThreadLocal<T> 来添加这个行为。

下面是一篇博客文章 它提供了一些关于如何编写包装器的指导。

© www.soinside.com 2019 - 2024. All rights reserved.