2012-04-23 5 views
6

私は.NET4のThreadLocal<T>を実行し、すべてのスレッドから.Valueの値を累積する方法があるのだろうかと思っていました。ThreadLocal <T>変数の値を組み合わせる方法はありますか?

マイクロソフトの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

.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

+2

を得たのか?私はこれが良い情報だと思いますが、少しばかりです。より詳細な情報は、誰かがSOに来るのに本当に役に立ちます。 –

5

この情報は使用できません。マイクロソフトはconsidering adding such a featureです。この動作を追加するには、ThreadLocal<T>のラッパーを記述する必要があります。

Here is a blog postこれは、ラッパーの書き方についての説明です。

関連する問題