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

时间:2012-04-23 14:08:15

标签: c# .net multithreading .net-4.0

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

2 个答案:

答案 0 :(得分:5)

此信息不可用。微软是considering adding such a feature。您需要在ThreadLocal<T>周围编写一个包装来添加此行为。

Here is a blog post提供了有关如何编写包装器的一些说明。

答案 1 :(得分:3)

自.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();

上述代码来自博客文章http://blogs.msdn.com/b/pfxteam/archive/2011/11/11/10236000.aspx