본문 내부에서 집중적 인 작업을 실행하는 Parallel.ForEach 루프가 있습니다.Parallel.ForEach 안에 해시 테이블을 사용하고 있습니까?
조작은 Hashtable을 사용하여 값을 저장하고 다른 연속 루프 항목에 대해 재사용 할 수 있습니다. 집중적 인 작업이 완료된 후 Hashtable에 추가하면 다음 루프 항목이 집중적 인 작업을 다시 실행하는 대신 Hashtable을 검색하여 개체를 다시 사용할 수 있습니다.
그러나 Parallel.ForEach를 사용하기 때문에 Hashtable.Add 및 ContainsKey (키) 호출이 동기화되지 않아 안전하지 않은 문제가 발생합니다. 이러한 호출은 병렬로 실행될 수 있으므로 동기화되지 않습니다. 잠금 장치를 도입하면 성능 문제가 발생할 수 있습니다.
다음은 샘플 코드입니다 :
Hashtable myTable = new Hashtable;
Parallel.ForEach(items, (item, loopState) =>
{
// If exists in myTable use it, else add to hashtable
if(myTable.ContainsKey(item.Key))
{
myObj = myTable[item.Key];
}
else
{
myObj = SomeIntensiveOperation();
myTable.Add(item.Key, myObj); // Issue is here : breaks with exc during runtime
}
// Do something with myObj
// some code here
}
일부 API, TPL 라이브러리 내부의 속성 설정, 즉이 시나리오를 처리 할 수 있어야합니다. 거기 있니?
@AdamRalph 필요하다고 생각 : 그는 TPL 라이브러리 그는를 사용하기 때문에 이미 .net 4를 사용 중입니다.0 –
@Adam & Yassir : 정확합니다. 새 컬렉션은 Parallel LINQ를 염두에두고 설계되었습니다. –
답변과 의견을 보내 주셔서 감사합니다 – Vin