2014-10-16 4 views
1

두 개의 사전 목록이 있습니다. 총 50 명의 사용자/스레드까지 스레드 당 한 명의 사용자를 쿼리합니다.스레드 안전 목록 또는 여러 목록 연결?

첫 번째 목록 인 "users"는 스레드 당 하나의 항목 만 포함합니다. 두 번째 목록 인 "items"에는 스레드 당 수천 개의 항목이 포함될 수 있습니다 (300은 양호한 평균 임).

현재로서는 단일 스레드에서 순차적으로 사용자를 쿼리합니다. 첫째, 한 사용자의 데이터가 수집됩니다 (동기식으로 구현되며 ~ 100ms의 일반 대기 포함). 그러면 사용자가 "사용자" 한 번에 하나씩 모든 항목이 처리되고 "항목"에 추가됩니다 (처리에는 1000 개의 항목에 대해 약 12 ​​밀리 초가 소요됨).

목록이 정렬되어 있지만 순서를 전혀 유지하지 않아도됩니다.

  • 첫 번째 목록은 ConcurrentBag을위한 좋은 장소입니다 다음과 같이

    는 지금은 생각했다.

  • 두 번째 목록의 경우 스레드마다 하나씩 여러 목록을 사용하는 것이 더 좋습니다. 끝에는 함께 연결됩니다.

그러나이 절차를 진행하기 전에 이것이 최선의 방법인지 또는 더 나은 해결책을 생각할 수 있는지 묻고 싶습니다. 병렬화 할 부분에서 두 목록 중 아무 것도 수행하지 않고 항목 추가 만 수행합니다.

+0

스레드 당 한 명의 사용자를 쿼리하는 특별한 이유가 있습니까? 응용 프로그램의 설정/디자인을 알지 못하면 다중 스레드가 아닌 다른 이유로 스레딩이 많이 발생합니다. – Joeb454

+0

@ Joeb454 각 사용자의 데이터가 다른 엔드 포인트에 저장 될 수 있기 때문에 우리가 조회하는 원래 API (다른 벤더의)의 설계로 인해 호출 당 한 명의 사용자 만 요청할 수 있습니다. – Alexander

답변

2

Thread-Safe Collections 문서의 경우 System.Collections.Concurrent 네임 스페이스 (ConcurrentBag 포함)의 컬렉션은 멀티 스레딩 요구 사항에 적합해야합니다.

Dictionary (System.Collections.Generic 네임 스페이스의) 주위의 lock을 사용하면 거대한 메모리 내 추가 전용 컬렉션에서 잘 작동한다고 말할 수 있습니다. 프로덕션 환경에서는 정기적으로 주기적으로 "만료 된"항목을 검색하여 제거하는 경우에도 문제없이 아무리 많은 항목도 정기적으로 보관합니다.

결론적으로, 항목에 대한 별도의 목록을 작성하고 나중에 연결해야 할 필요는 없습니다. 물론이 접근법은 아마도 잘 작동 할 것입니다. 당신이 개인적으로 가장 편리하다고 생각하는 곳으로 내려올 수 있습니다.