7

.NET 4に出くわしましたが、すべてのスレッドから値ThreadLocal<T>を累積する方法があるかどうか疑問に思いました。.Value

彼らが持っているMicrosoftのpplC++ライブラリには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

この情報は、.NET4.0では使用できません。4.5以降については、Joaoの回答を参照してください。

Microsoftはそのような機能を追加することを検討していますThreadLocal<T>この動作を追加するには、ラッパーを作成する必要があります。

これは、ラッパーの作成方法に関するいくつかの指示を与えるブログ投稿です。

于 2012-04-23T14:18:32.710 に答える