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