Я пишу приложение, которое отображает список объектов, которые пользователь может выбирать, а затем просматривать и редактировать свойства с помощью элемента управления PropertyGrid. Свойства объекта заполняются трудоемким процессом извлечения информации из файлов с использованием вторичного потока. Но я также хотел бы позволить пользователю продолжать просматривать другие объекты по мере выполнения процесса извлечения.
После прочтения ответов на мои предыдущие вопросы по SO. Похоже, что поскольку свойства, которые записываются в процессе извлечения, не пересекаются со свойствами, доступными для редактирования пользователем через сетку свойств, у меня не должно быть проблем с двумя потоками, редактирующими объекты одновременно. Хотя пользователь может увидеть неправильное значение, если ему невероятно не повезло, и сетка свойств в конечном итоге считывает объект в середине неатомарной записи.
Тем не менее, я все еще хотел бы знать, как я могу настроить это, чтобы пользователь не мог редактировать или просматривать объект, который находится в процессе извлечения. Я очень-очень новичок в многопоточности, но большинство примеров, которые я читал, показывают, что создается отдельный токен-объект, который используется для блокировки доступа к фактическому интересующему объекту. Ответы на мой другой предыдущий вопрос подтвердили, что создание отдельный объект, подобный этому, специально для блокировки.
Итак, теперь я хотел бы знать, как это обрабатывается в моем случае, когда у меня есть большая коллекция объектов? Я хотел бы создать блокировки, которые не позволяют сетке свойств отображать объект, который выбирает пользователь, если он в настоящее время извлекается.
Нужно ли мне создавать отдельную коллекцию объектов блокировки, которая синхронизируется с моей реальной коллекцией? Итак, если объект добавляется или удаляется из моей основной коллекции, мне нужно добавлять или удалять объекты блокировки из моей коллекции блокировок?
Должен ли я блокировать фактические объекты, а не создавать отдельные объекты блокировки токена?
Как насчет добавления логического свойства «IsBeingExtracted» к объектам, которые сетка свойств может проверять, находится ли объект в процессе записи? Затем это будет установлено в самом начале и в самом конце процесса извлечения.
Или как насчет статического поля где-то, которое ссылается на текущий (если есть) объект, который в настоящее время извлекается. Затем сетка свойств может проверить, что последний объект, который был запрошен для отображения, не был объектом, на который ссылается это статическое поле? Это, конечно, не сработало бы, если бы было несколько потоков извлечения.
Как лучше/правильнее это сделать? Лично мне больше всего нравится вариант логического свойства, но я хотел бы знать, что думают другие, которые на самом деле знают, что они делают.