を使用して、私はこのコードを持っている:予期しない動作Parallel.Foreach
// positions is a List<Position>
Parallel.ForEach(positions, (position) =>
{
DeterminePostPieceIsVisited(position, postPieces);
});
private void DeterminePostPieceIsVisited(Position position, IEnumerable<Postpieces> postPieces)
{
foreach (var postPiece in postPieces)
{
if (postPiece.Deliverd)
continue;
var distanceToClosestPosition = postPiece.GPS.Distance(position.GPS);
postPiece.Deliverd = distanceToClosestPosition.HasValue && IsInRadius(distanceToClosestPosition.Value);
}
}
}
は、私は50個のポスト片がtrueにプロパティDeliverd
セットを持たなければならないことを知っています。しかし、このコードを実行すると、結果が変化します。時々私は44になり、別の時間に実行すると47になります。結果は実行ごとに異なります。
普通のforeachループを使用してこのコードを実行すると、予想される結果が得られます。だから私はDeterminePostPieceIsVisited
メソッドの実装が正しいことを知っています。
誰かが私にこのコードを実行するたびに異なる結果を与えるParallel foreachを使用する理由を説明できますか?同じコレクションが複数のスレッドによって変更されるよう、原因のデータが破損する結果に差が生じる競合状態を引き起こしている、次の並列コードで
すべての並行作業者に、同じ* 'postPieces'コレクションを反復するように求めています。スレッドセーフでないオブジェクトに複数のライターを抱えていると、問題が発生することがあります。 – AakashM
これを解決する解決策は何でしょうか? – Martijn
なぜこのような場合に 'Parallel.ForEach'を使用していますか? – user3185569