如何组合 ThreadLocal 中的所有值

本文关键字:何组合 组合 ThreadLocal | 更新日期: 2023-09-27 18:32:08

>我遇到了 .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));
}

如何组合 ThreadLocal<T> 中的所有值

从 .NET 4.5 开始,Microsoft向 ThreadLocal 类添加了一个名为 Values 的属性,该属性完全可以满足您的需求。以下是它的工作方式:

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

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

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

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