如何组合 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));
}
从 .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>
编写一个包装器来添加此行为。
这是一篇博客文章,提供了有关如何编写包装器的一些说明。