2016-10-03 5 views
-1

更新が必要なPersonの「別個の」リストがあるとします。私はParallel.For()問題のアイテムのプロパティを更新するParallel.For()

メソッドを使用したいと思います:

public void UpdatePerson(Person row){ 
    row.Name = //get from cache and update property 
} 

VSを

public Person UpdatePerson(Person row){ 
    row.Name = //get from cache and update property 
    return row; 
} 

Parallel.Forを使用する場合は()このリストを列挙し、並行して、これらの更新を実行します(つまり、このメソッドを呼び出す)、他のものを使用することに潜在的な問題はありますか?

+1

'UpdatePerson'を呼び出すコードを表示する必要があります。' //キャッシュから取得し、プロパティを更新する 'スレッドセーフですか?問題なく複数のスレッドから同時に使用できますか?最後に、 'Name'プロパティが自動実装されたプロパティでない場合は、それも表示する必要があります。 –

+0

キャッシュの実装はスレッドセーフではありません。しかし、ここではParallel.forを実行する前にキャッシュに書き込んだとしますが、変更は書き込まれません。ユニークな識別子に基づいてキャッシュから読み込み(リスト内のすべての人が区別されていることがわかっていれば)重要ですか? 1つのタスクはid1の値を取得するため、他のid2など(同時に異なるIDで) – ShaneKm

答えて

1

何がやりたいことは、あなたがループのために、この目的のために使用することを選ぶだろう、人々のリストの項目にいくつかの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なので、この注意深いことを考慮する必要があります。

-2

あなたの返品対象が何であるかは関係ありません。 Parallel.For()は、メソッドの実行方法によって同じ動作をします。返されるPersonがそれを使用するのを待っていると、更新が完了するまでPersonオブジェクトを返さないため、アプリケーションの速度が低下する可能性はありません。

戻り値が無効な場合は、アプリケーションの他の部分が戻り値を待つことはなく、理論上は更新が発生したときに関係なく正常に実行されます。

関連する問題