2016-08-09 6 views
2

QueueUserWorkItemを呼び出すことによって、キューが異なるスレッドに作用するループが狭くなります。スレッドに引き渡される引数がタイトループで生成される

各ループの実行が、以前のプールスレッドの引数として渡されたものを潜在的に変更する可能性があるのだろうかと思いました。

List<object> list = new List<object>(); 

for (int i = 0; i < list.Count; i++) 
{ 
    object param = list[i]; 
    ThreadPool.QueueUserWorkItem(x => { MethodWithParameter(x); }, param); 
} 

答えて

2

各ループの実行が潜在的に前のプールのスレッド

いいえ、タスクをキューイングされたコードの一部に引数として渡されたものを変更することができれば、私は思っていましたプールは、同期であるに

だからparamの値は、方法の呼び出しの点にあるものは何でもタスクが実際に実行されたときのparamの値がどうなるか全く言うことがないので

object param = null; 
for (int i = 0; i < list.Count; i++) 
{ 
    //even though you are assigning a value to param here 
    //there is no telling when the task will actually execute 
    param = list[i]; 
    ThreadPool.QueueUserWorkItem(x => { MethodWithParameter(param); }, null); 
} 

:タスクはあなたがトラブルこのような何かをやって入ることができ

を開始したときはxとして渡されます。

+0

サイドノート:明らかに、同じアイテムでいっぱいになっていれば、すべてのベットはオフになっています...しかし実際、このコードはクロージャの問題とプレC#5でのforeachを解決します(http://stackoverflow.com/questions/ 512166/the foreach-identifier-and-closures) –

+0

私の質問はおそらく私の次のコメントを誤って解釈しています。http://stackoverflow.com/questions/30225476/task-run-with-parameters#comment48555456_30225551 Zer0のコメントから、 'QueueUserWorkItem'を使用してスレッドを開始し、' Task.Run'を使用すると、渡された引数で同じ潜在的な問題が発生するようですが、これは真実ではありません。私は何かを誤解していますか? – Stefano

+0

@Stefano:Zer0のコメントが間違っています。呼び出し時に渡される参照は、状態としてワーカー項目に渡されます。ここでコメントが間違っていることを証明するデモが表示されます。https:// dotnetfiddle .net/56arkp – konkked

関連する問題