【问题标题】:How to combine all values from a ThreadLocal<T>?如何组合来自 ThreadLocal<T> 的所有值?
【发布时间】:2012-04-23 14:08:15
【问题描述】:

我遇到过 .NET 4 的 ThreadLocal&lt;T&gt;,想知道是否有办法从所有线程中累积 .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));
}

【问题讨论】:

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


    【解决方案1】:

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

    以上代码取自博文:New in .NET 4.5: ThreadLocal.Values

    【讨论】:

      【解决方案2】:

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

      微软是considering adding such a feature。您需要围绕 ThreadLocal&lt;T&gt; 编写一个包装器来添加此行为。

      Here is a blog post 给出了一些关于如何编写包装器的指导。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-30
        • 2020-11-23
        • 1970-01-01
        • 2019-11-19
        • 2015-10-15
        • 1970-01-01
        • 1970-01-01
        • 2022-06-10
        相关资源
        最近更新 更多