하면 루프이 목적을 위해 사용하도록 선택하는 것, 이제 싶은 것은 사람들의 목록에있는 항목에 대한 몇 가지 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이므로주의 깊게 고려해야합니다.
'UpdatePerson'을 호출하는 코드가'// get cache and update property' 스레드로부터 안전하다는 것을 보여줄 필요가 있습니까? 문제없이 여러 스레드에서 동시에 사용할 수 있습니까? 마지막으로,'Name' 프라퍼티가 자동 임 플리 멘트 프라퍼티가 아니라면 우리에게도 보여줄 필요가 있습니다. –
캐시 구현은 스레드로부터 안전하지 않습니다. 그러나이 토론의 목적을 위해 Parallel.for를 실행하기 전에 캐시에 작성했으며 변경 사항은 기록되지 않습니다. 고유 한 식별자를 기반으로 캐시에서 읽기 (목록에있는 모든 사람이 구분된다는 사실을 알고 있음) 중요합니까? 하나의 Task는 id1에 대한 값을 얻을 것이기 때문에 다른 하나의 id2는 (동시에 다른 id에서) – ShaneKm