List<string>
の並列処理には1つの方法があります。残念ながら.NET 4+は使用できません。ManualResetEventによる並列プログラミング
しかし、私はこの方法を実行すると、i
はいつも私が
X 0
×1
×2
を達成するために変更する必要が何items.Count
public static void ParallelForEachTest(List<string> items)
{
if (items != null && items.Count > 0)
{
List<ManualResetEvent> mEventList = new List<ManualResetEvent>();
for (int i = 0; i < items.Count ; i++)
{
ManualResetEvent mEvent = new ManualResetEvent(false);
ThreadPool.QueueUserWorkItem((y) =>
{
Console.WriteLine(items[i] + i);
mEvent.Set();
});
mEventList.Add(mEvent);
}
mEventList.ForEach(x => x.WaitOne());
}
}
ですParallelForEachTest(new List<string>(){"x","x","x"});
奇妙な方法。私はあなたの並列化されたコードにパラメータとしてiの値を渡すことを検討する必要があると思う... – Ian
標準的なバグ、それはlamba式のforループ変数をキャプチャします。 [これを読む](https://blogs.msdn.microsoft.com/ericlippert/2009/11/12/closing-over-the-loop-variable-considered-harmful/)。スレッドが実行を開始するまでに、 'i'変数はすでにインクリメントされています。通常。 'var index = i;'を使用し、インデックスを取得します。 –