2012-04-05 7 views
-2

私はTPLを使用しようとしています。それは正常に動作するはずはありません、私がアクション・ボディの中で定義するものはすべて完全に別ですか?それは事実ではないようです。誰かが私を正しい方向に向けることができますか? 基本的には、メソッドを複数回実行するだけです。このメソッドは、実行されるrunメソッドを持つオブジェクトのインスタンスを常に作成します。C#TPL - 分離されていますか?

+0

ない明確なまったく何をしたいです。 – Aliostad

+0

あなたは、実際の結果と一緒に、問題のコードを投稿し、必要があるあなたの期待される結果が何であるか - とあなたが思うなぜ彼らは異なってはなりません。 – vcsjones

+0

は簡単な例を用意します。 – user1313693

答えて

1

あなたはコードを提供していませんが、霊能力のデバッグは、あなたがラムダの主な特徴の1つ、すなわちクロージャーを見つけたことを示唆しています。 (または新しいコメントあたり:同期、またはむしろその欠如)

考えてみましょう:

int x = 0; 
Action y =() => Console.WriteLine("{0}", x++); 
Action z =() => Console.WriteLine("{0}", --x); 

両方yzxの同じインスタンスを参照します。さて、これは簡単な例ですが、forループまたはforeachでケースを考えてみます。

for (int i = 0; i < 10; ++i) 
{ 
    Task.Factory.StartNew(() => Console.WriteLine("{0}", i)); 
} 

すべての10個のタスクは、同じ変数iを参照します!実際に、彼らはおそらく、すべてにも同じiを受け取ることになります。彼らは、メモリ内の同じ変数周りのすべて閉鎖されているためです。

あなたは彼らが独立しているしたい場合、彼らは彼らの閉鎖のための独立変数が必要になります:

foreach (var datum in data) 
{ 
    // Because myDatum is local to *each* loop iteration, 
    // each Task will receive its own variable. The same 
    // strategy applies to for-loops. 
    var myDatum = datum; 
    Task.Factory.StartNew(() => Frob(myDatum)); 
} 

あなたはサンセリフコードを再度、に実行してきましたおそらく、他の場合には、データ構造の同期化]です。あなたがconcurrent data structureを使用している場合を除き、箱から出して何の同期はありません。

var bad = new List<int>();   // No implicit thread safety 
var good = new ConcurrentBag<int>(); // Thread safe access 

Parallel.For(0, 1000, x => bad.Add(x)); 
Parallel.For(0, 1000, x => good.Add(x)); 

は、我々が議論してきた二つの問題を組み合わせることで、あなたは、次の一見正しいコード付きに実行します問題を見ることができますか?

var counts = new Dictionary<int, int>(); 
for (int i = 0; i < 1000; ++i) 
{ 
    // How many ways can this fail? One should be enough. 
    Task.Factory.StartNew(
     () => 
     { 
      counts[i] = GetCounts(i); 
     }); 
} 
+0

ありがとう、私はこれを理解し、私の場合はループ変数を使用しないので、さらに簡単です。
<! - 言語:C#の - >のために(;私は= 0 int型<10; ++ I) { Task.Factory.StartNew( ()=> { するvar人=新しい人() ; person.LoadInfoFromFile(); person.CheckAnything();} )。 } – user1313693

+0

申し訳ありませんが、編集に問題があります。それを修正します。この例は完全に独立してはいけませんか? – user1313693

+0

'LoadInfoFromFile'と' CheckAnything'は互いに排他的ですか?あなたが持っているものに非常に近いはずです。簡潔さのための小さな変化はOkです。しかし、スレッディングでは、正確なコードがないとすべての問題を知ることが難しいことがよくあります。 – user7116

関連する問題