2016-07-02 17 views
1

Parallel.Foreach()を使用すると、スレッドローカルデータを実現するためのメカニズムが組み込まれています。私はPLINQ AsParallel()を使用するときに同様のものが必要です。スレッドローカルデータをPLINQ AsParallel()で使用しますか?

私はlist.AsParallel().ProcessElement(threadlocalresource)のようなPLINQ文を書くことができます。

ThreadLocal<T>が助けになる可能性がありますが、PLINQ文の完了後にリソースを処分する方法がわかりません。

コピー/パッチを追加し、ウサギの穴の下に依存関係のトンを経由して巻き上げることを期待して、AsParallel()のソースコードを調べました...本当に簡単に実行できません。

答えて

3

実際には、PLINQはスレッドローカルデータを明示的にサポートしていません。それでもあなたにとって最良の組み合わせだと思う場合は、とそのValuesプロパティを使用して後でクリーンアップすることができます。例:

using (var threadLocal = new ThreadLocal<SomeType>()) 
{ 
    result = list.AsParallel().Select(/* use threadLocal.Value here */).ToList(); 

    foreach (var resource in threadLocal.Values) 
    { 
     resource.Dispose(); 
    } 
} 
+0

コードでは、using()は値を破棄しないでください。 – CoderBrien

+0

@CoderBrien [参照元によると、それはありません。](http://referencesource.microsoft.com/#mscorlib/system/threading/ThreadLocal.cs,80de775120278afd) – svick

+0

ああ、つかまります。 'using()'は 'SomeType'オブジェクトへの参照を解放することによって' ThreadLocal'を破棄しますが、 'Dispose()'呼び出しをオブジェクト自体に伝播しません。ありがとう!!! – CoderBrien

関連する問題