7

我遇到过 .NET 4 ThreadLocal<T>,想知道是否有办法.Value从所有线程中累积值。

在他们拥有的 Microsoft 的 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));
}
4

2 回答 2

6

从 .NET 4.5 开始,Microsoft 添加了一个名为该类的属性Values,该属性ThreadLocal完全符合您的需要。这是它的工作方式:

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

于 2015-10-23T01:31:30.347 回答
4

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

微软正在考虑添加这样的功能。您将需要编写一个包装器ThreadLocal<T>来添加此行为。

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

于 2012-04-23T14:18:32.710 回答