何がやりたいことは、あなたがループのために、この目的のために使用することを選ぶだろう、人々のリストの項目にいくつかのopertaionである、のは一瞬平行部を残してみましょう:
for(int i = 0; i < persons.Length, i++)
{
persons[i].Name = "SomeName;
}
またはforeachループ:
foreach(Person person in persons)
{
person.Name = "SomeName";
}
私はそれがはるかに適切かつ明確に見つけるため当然の選択である私のopnionで、この場合には、foreachループを使用することを好みます。
ここで並列部分に戻るには、Parallel.For()を使用してループを並列に実行し、Parallel.Foreach()を使用してforeachループを並列に実行する必要があります。
この場合、foreachループがより適切であることに同意すれば、Parallel.For()よりもParallel.Foreach()を優先する必要があります。
Parallel.Foreach()はTのアクションを引数として取るため、操作にメソッド名を渡す場合は、Action of Tがvoidメソッドの代理人であるため、voidメソッドでなければなりませんそれは、型Tの一つのパラメータを取得します
ので、動作するはずです、あなたの最初のアプローチを使用して:
:
public void UpdatePersonName(Person person)
{
person.Name = "SomeName";
}
と平行部を(thisオーバーロードを使用して)ので
public Person UpdatePersonName(Person person)
{
person.Name = "SomeName";
return person;
}
インサイドParallel.Foreach():あなたはあなたの第二の方法を使用することはできません。この理由から
Parallel.Foreach(persons, person => person.Name = "SomeName");
:10
代わりseprateメソッドを作成する別のオプションは、ラムダ式を使用することです戻り値の型は無効ではありません。
Parallel.Foreach()を使用している場合は、スレッドの安全性を保証する必要があります。また、ほとんどの場合、ロックを使用する必要があります。
場合によってはオーバーヘッドの価値がない場合があり、場合によってはforeach loops can run faster than their parallel equivalentsなので、この注意深いことを考慮する必要があります。
'UpdatePerson'を呼び出すコードを表示する必要があります。' //キャッシュから取得し、プロパティを更新する 'スレッドセーフですか?問題なく複数のスレッドから同時に使用できますか?最後に、 'Name'プロパティが自動実装されたプロパティでない場合は、それも表示する必要があります。 –
キャッシュの実装はスレッドセーフではありません。しかし、ここではParallel.forを実行する前にキャッシュに書き込んだとしますが、変更は書き込まれません。ユニークな識別子に基づいてキャッシュから読み込み(リスト内のすべての人が区別されていることがわかっていれば)重要ですか? 1つのタスクはid1の値を取得するため、他のid2など(同時に異なるIDで) – ShaneKm