2016-10-03 2 views
-1

업데이트해야하는 Person의 "distinct"목록이 있다고 가정합니다. 나는 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'을 호출하는 코드가'// get cache and update property' 스레드로부터 안전하다는 것을 보여줄 필요가 있습니까? 문제없이 여러 스레드에서 동시에 사용할 수 있습니까? 마지막으로,'Name' 프라퍼티가 자동 임 플리 멘트 프라퍼티가 아니라면 우리에게도 보여줄 필요가 있습니다. –

+0

캐시 구현은 스레드로부터 안전하지 않습니다. 그러나이 토론의 목적을 위해 Parallel.for를 실행하기 전에 캐시에 작성했으며 변경 사항은 기록되지 않습니다. 고유 한 식별자를 기반으로 캐시에서 읽기 (목록에있는 모든 사람이 구분된다는 사실을 알고 있음) 중요합니까? 하나의 Task는 id1에 대한 값을 얻을 것이기 때문에 다른 하나의 id2는 (동시에 다른 id에서) – ShaneKm

답변

1

하면 루프이 목적을 위해 사용하도록 선택하는 것, 이제 싶은 것은 사람들의 목록에있는 항목에 대한 몇 가지 opertaion입니다, 잠시 병렬 부분 떠나 보자 : 나는 분명한 선택을 내 opnion에서, 훨씬 더 적합하고 명확 찾을 수 있기 때문에이 경우에는 foreach 루프를 사용하는 것을 선호

foreach(Person person in persons) 
{ 
    person.Name = "SomeName"; 
} 

.
평행 부분으로 돌아가려면 Parallel.For()을 사용하여 루프를 병렬로 실행하고 Parallel.Foreach()을 사용하여 foreach 루프를 병렬로 실행해야합니다.
그래서 foreach 루프가이 경우 더 적절하다고 동의하면 Parallel.Foreach()를 Parallel.For()보다 선호해야합니다.

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 객체를 반환하지 않기 때문에 잠재적으로 응용 프로그램의 속도를 저하시킬 수 없습니다.

반환 값이 유효하지 않으면 응용 프로그램의 일부 다른 부분이 반환 값을 기다리지 않고 이론적으로 업데이트가 발생해도 관계없이 정상적으로 실행되어야합니다.

for(int i = 0; i < persons.Length, i++) 
{ 
    persons[i].Name = "SomeName; 
} 

또는 Foreach 루프 :

관련 문제