2013-01-04 1 views
0

나는 Azure 서버에서 일부 데이터를 크런치하는 코드를 작성했다.병렬 루프를 만드는 올바른 방법

Parallel.ForEach(users, currentUser => 
    { 
    int number = myrollup.CountFilmsForUsers(currentUser.UserId,distort,tend).Result; 
    lock(myrollup) 
     { 
     var record = new UserAnalytics(); 
     { 
      UserId = currentUser.UserId, 
      UserFName = currentUser.FirstName, 
      UserLName = currentUser.LastName, 
     }; 
     session.SaveOrUpdate(record); 
     } 
    }); 

이 병렬 루프는 9 분의 일을 : 나는 코드를 쓴 처음으로, 그것은 각 루프에 대한 선형이고 완료 될 영원히 걸릴 것이라고, 나는 다음과 같이 병렬를 사용하여 코드를 개선 , 그러나 나는 이것을 생산자/소비자 패턴을 사용하여 더 향상시키고 자한다. C#에서 Nhibernate를 사용하여이 작업을 수행하는 방법에 대한 아이디어가 있습니까?

+3

무언가를 병렬로 수행하면 잠금 장치가있는 루프의 몸체 대부분을 지키지 않아도 매우 평행하게되지 않습니다. – vcsjones

+1

이 질문은 너트입니다 – vidstige

+0

Nhibernate는 스레드로부터 안전하지 않기 때문에 이것이 원하는만큼 병렬이 아니라는 것을 알고 있습니다. 그래서 Producer/Consumer 패턴을 사용하여 읽기 전용 스레드를 만들고 SQL DB에 데이터를 쓰는 스레드를 만들고 싶습니다. – user843681

답변

0

NHibernate 세션을 여러 스레드간에 공유하는 것은 좋은 생각이 아닙니다. nhibernate profiler을 사용하여 병목 현상을 찾거나 StatelessSession으로 전환하십시오.