사용자가 선택할 수있는 객체 목록을 표시하는 응용 프로그램을 작성한 다음 PropertyGrid 컨트롤을 통해 속성을보고 편집 할 수 있습니다. 개체의 속성은 보조 스레드를 사용하여 파일에서 정보를 추출하는 시간이 많이 걸리는 프로세스로 채워집니다. 그러나 추출 프로세스가 진행되는 동안 사용자가 다른 객체를 계속 볼 수있게하고 싶습니다.개체 컬렉션에 대한 다중 스레드 액세스를 어떻게 제어합니까?
my previous 개의 질문에 대한 답변을 읽은 후. 그것은 추출 프로세스에 의해 쓰여지는 속성이 속성 그리드를 통해 사용자가 편집 할 수있는 속성과 교차하지 않기 때문에 발생합니다. 동시에 개체를 편집하는 두 스레드에 문제가 있어서는 안됩니다. 믿을 수 없을 정도로 재수가 많고 속성 그리드가 비 원자 적 쓰기 도중에 객체를 읽게되면 사용자가 잘못된 값을 볼 수도 있습니다.
그러나 아직 사용자가 추출 중에있는 객체를 편집하거나 볼 수 없도록 설정하는 방법을 알고 싶습니다. 필자는 멀티 스레딩을 처음 접했지만 실제로 읽은 대부분의 예제는 실제 관심 객체에 대한 액세스를 잠그기 위해 사용되는 별도의 토큰 객체를 보여줍니다. 내 다른 previous question에 대한 답변은 잠금과 같은 별도의 개체를 만드는 것이 일반적이라는 것을 확인했습니다.
그래서 지금 내가 알고 싶은 것은 내 물건에 많은 양의 컬렉션이있는 경우 어떻게 처리할까요? 나는 현재 추출 된 경우 사용자가 선택하는 객체를 표시하는 속성 격자를 막는 잠금을 만들고 싶습니다.
실제 컬렉션과 동기화 된 잠금 객체 모음을 별도로 만들어야합니까? 개체가 주 컬렉션에 추가되거나 제거되면 잠금 컬렉션에서 잠금 개체를 추가하거나 제거해야합니까?
별도의 토큰 잠금 개체를 만드는 대신 실제 개체를 잠급니다.
객체가 쓰여지는 동안 속성 격자가 확인할 수있는 객체에 "IsBeingExtracted"부울 속성을 추가하는 것은 어떻습니까? 이것은 추출 과정의 맨 처음과 마지막에 설정됩니다.
또는 현재 추출 된 현재 (있는 경우) 개체를 참조하는 어딘가에 정적 필드 어때? 그런 다음 속성 격자는 표시 할 최신 객체가이 정적 필드에서 참조하는 객체가 아닌지 확인할 수 있습니다. 물론 추출 스레드가 여러 개있는 경우에는 물론 작동하지 않습니다.
가장 좋은 방법/올바른 방법은 무엇입니까? 개인적으로 부울 속성 옵션이 가장 좋지만 실제로 생각하는 다른 사람들이 생각하는 것을 알고 싶습니다.
잠금 장치를 두 번째 이상 보유해야하는 이유는 무엇입니까? 동기화 스레드의 일부는 경합에있을 수있는 시간의 길이를 최소화합니다. –
@Rory - 잠금을 유지할 시간이 아니라 항목을 편집하기 위해 대기하는 시간입니다. – ChaosPandion