私はTPLを使用しようとしています。それは正常に動作するはずはありません、私がアクション・ボディの中で定義するものはすべて完全に別ですか?それは事実ではないようです。誰かが私を正しい方向に向けることができますか? 基本的には、メソッドを複数回実行するだけです。このメソッドは、実行されるrunメソッドを持つオブジェクトのインスタンスを常に作成します。C#TPL - 分離されていますか?
答えて
あなたはコードを提供していませんが、霊能力のデバッグは、あなたがラムダの主な特徴の1つ、すなわちクロージャーを見つけたことを示唆しています。 (または新しいコメントあたり:同期、またはむしろその欠如)
考えてみましょう:
int x = 0;
Action y =() => Console.WriteLine("{0}", x++);
Action z =() => Console.WriteLine("{0}", --x);
両方y
とz
x
の同じインスタンスを参照します。さて、これは簡単な例ですが、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);
});
}
ありがとう、私はこれを理解し、私の場合はループ変数を使用しないので、さらに簡単です。
<! - 言語:C#の - >のために(;私は= 0 int型<10; ++ I) { Task.Factory.StartNew( ()=> { するvar人=新しい人() ; person.LoadInfoFromFile(); person.CheckAnything();} )。 } –
user1313693
申し訳ありませんが、編集に問題があります。それを修正します。この例は完全に独立してはいけませんか? – user1313693
'LoadInfoFromFile'と' CheckAnything'は互いに排他的ですか?あなたが持っているものに非常に近いはずです。簡潔さのための小さな変化はOkです。しかし、スレッディングでは、正確なコードがないとすべての問題を知ることが難しいことがよくあります。 – user7116
- 1. JSONとXMLのWebサービスが分離されていますか?
- 2. このLPARAMは正しく分離されていますか?
- 3. C++の分離されたフリーリスト
- 4. なぜこのトランザクションは分離されていませんか?
- 5. アレイ分離--- C
- 6. C#winforms:GUIとロジックの分離が正しく行われていますか?
- 7. インターフェイス分離原則はいつ適用されますか? SOA?
- 8. Zend Frameworkのデータベーストランザクション:それらは分離されていますか?
- 9. MySQLトランザクションの分離レベルが壊れていますか?
- 10. なぜUIFontとCGFont/CTFontは完全に分離されていますか?
- 11. フレームとiframeは分離されたjavascriptコンテキストを持っていますか?
- 12. MassTransitは、分離されたEntity Frameworkグラフをサポートしていますか?
- 13. 現在のトランザクション分離レベルでトリガーが実行されていますか?
- 14. 静的関数はTomcatのJSP/Grailsアプリケーションで分離されていますか?
- 15. バージョンが取得されていないJPAオブジェクトが分離されています
- 16. 分離された文字列を配列にしますか?
- 17. スコープが分離されているかどうかをチェックするには?
- 18. C#複数のコンソールアプリケーションが実行され、分離
- 19. Djangoタグ付け - タグが分離されているとのトラブル
- 20. 分離されたオブジェクトをJPAに引き渡す方法はありますか? (分離されたエンティティが継承に渡されます)
- 21. PHPの$ _SESSIONでビルドされたコードシナイターのセッションシステムはどのように分離されていますか?
- 22. Herokuレビューアプリ - 分離されたバックエンドとフロントエンド
- 23. このCSSデザインのどの部分がIEから離れていますか?
- 24. C#TPLよりもC++ PPLの方が速いですか?
- 25. 異なるEclipse構成のプラグインが分離されていません
- 26. 分離したスレッドで$ {resource}を使用していますか?
- 27. ブートストラップがボタンを分離していますか?
- 28. iCanHaz.js - テンプレートを分離していますか?
- 29. AsyncTaskとUIスレッドの分離/分離
- 30. Entity Framework 6に分離されたエンティティを保存します。
ない明確なまったく何をしたいです。 – Aliostad
あなたは、実際の結果と一緒に、問題のコードを投稿し、必要があるあなたの期待される結果が何であるか - とあなたが思うなぜ彼らは異なってはなりません。 – vcsjones
は簡単な例を用意します。 – user1313693