2011-02-07 10 views
3

タスク並列ライブラリを使用して一連のアイテムの関数呼び出しをスケジュールしようとしています。タスク並列ライブラリの使用に関するヘルプ

次は

List<Task> tasks = new List<Task>(); 

foreach(var someValue in aCollection) 
{ 
    var t = Task.Factory.StartNew(() => DoSomeWork(someValue)); 
    tasks.Add(t); 
} 

Task.WaitAll(tasks.ToArray()); 

を動作しません。しかし、以下では、それは一度実行してから停止する最初のアプローチのために

Task.WaitAll(aCollection.Select(a => Task.Factory.StartNew(() => DoSomeWork(a))).ToArray()); 

に動作します。私は参照または何かを上書きするかどうかはわかりません。誰かがplsすることができますか?説明する?

タスクに最初にスケジュールされたタスクを識別するために使用できるシーケンス番号をタスクに渡す方法もあります。私はすべてのタスクが完了するのを待っていますが、コレクション内のシーケンスに基づいて結果を並べ替えることを望みます。

+1

http://stackoverflow.com/questions/2956328/foreach-failing-when-using-parallel-task-library/3155693#3155693 –

+0

@Jim:ありがとうございます。シーケンスのことについてのアイデアは? – stackoverflowuser

答えて

5

これは実行を停止する原因になっているかどうかは知りませんが、ここでclosing over the loop variableだから多分それはです:

DoSomeWork(someValue)); 

あなたはローカル変数を作成し、それにsomeValueを割り当て、次に使用する必要がありますそのローカル変数、そのような私のリンクの質問に記載されているよう:

再び
foreach(var someValue in aCollection) 
{ 
    var localCopy = someValue; 

    var t = Task.Factory.StartNew(() => DoSomeWork(localCopy)); 
    tasks.Add(t); 
} 

、それがあなたのデッドロックの問題に問題がある場合、私はさっぱりだが、それが最も可能性の高い問題が発生する問題の1つです。

+0

はい。それが問題でした。ありがとう。 +1。シーケンスのことはどうですか?何か案が? – stackoverflowuser

+1

[for this task of task](http://msdn.microsoft.com/en-us/library/dd235693.aspx)と組み合わせて 'for'ループを使うことができます。渡された 'object'は[AsyncState](http://msdn.microsoft.com/en-us/library/system.threading.tasks.task.asyncstate.aspx)に割り当てられ、何でもかまいません。完全に任意です。この場合、イテレータ変数( 'i')を渡し、' WaitAll'が終了したときにそれを取得するだけです。 – mgbowen

+0

例が役立ちます。ありがとう。 – stackoverflowuser

関連する問題