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);
}
サイドノート:明らかに、同じアイテムでいっぱいになっていれば、すべてのベットはオフになっています...しかし実際、このコードはクロージャの問題とプレC#5でのforeachを解決します(http://stackoverflow.com/questions/ 512166/the foreach-identifier-and-closures) –
私の質問はおそらく私の次のコメントを誤って解釈しています。http://stackoverflow.com/questions/30225476/task-run-with-parameters#comment48555456_30225551 Zer0のコメントから、 'QueueUserWorkItem'を使用してスレッドを開始し、' Task.Run'を使用すると、渡された引数で同じ潜在的な問題が発生するようですが、これは真実ではありません。私は何かを誤解していますか? – Stefano
@Stefano:Zer0のコメントが間違っています。呼び出し時に渡される参照は、状態としてワーカー項目に渡されます。ここでコメントが間違っていることを証明するデモが表示されます。https:// dotnetfiddle .net/56arkp – konkked