У меня есть PropertyGrid
в моем приложении, которое используется для редактирования произвольных объектов. Мне нужно иметь возможность запускать произвольную подпрограмму в другом потоке, который также смотрит на эти объекты (функция поиска, если вам интересно). Очевидная проблема заключается в том, что пользователь может редактировать один из этих объектов, в то время как моя поисковая строка читает его, что было бы предпочтительнее избегать (хотя это, вероятно, не приведет к чему-либо критическому, поскольку моя строка поиска просто читает, не писать)..Net PropertyGrid Thread-security
Вызов lock(obj)
достаточно легко из моей поисковой темы, но после просмотра документации и краткого обезжиренного с помощью кода PropertyDescriptorGridEntry в отражателе, я не могу найти аналогичное место, чтобы использовать System.Threading.Monitor.Enter()/Exit()
вызов на объекте в вопросе о PropertyGrid. Я надеялся, что будут события BeginEdit и EndEdit, которые сделают это достаточно простым, но я не могу найти ничего подобного. Я бы предпочел не блокировать весь объект, пока он отображается в PropertyGrid, поскольку это, очевидно, блокирует мой поток поиска, пока не будет выбран другой объект.
Я немного новичок в модели Threading для Windows Forms, поэтому я надеюсь, что есть некоторые очевидные ответы, которые я просто забыл. Любая помощь?
Edit: Синхронно клонировать мои объекты перед запуском поиска асинхронно, вероятно, будет достаточно неэффективным, что я мог бы также запустить сам поиск синхронно - точка запуска асинхронно, конечно, чтобы позволить своим пользователям продолжать работать некоторое время выполняется поиск. Поиск должен хорошо масштабироваться, поскольку набор данных, который я собираюсь пройти, в конечном итоге окажется сколь угодно большим, что делает синхронное клонирование похожим на то, что это вызовет проблему удобства использования, которую я пытаюсь избежать.
На самом деле, в случае с PropertyGrid вы можете сделать это проще, подклассифицируя PropertyTab и переопределяя GetProperties. Все еще ** много ** работы, но на самом деле вам не нужно проталкивать через ICustomTypeDescriptor (и TypeDescriptionProvider) –
@Marc Gravell: You все еще нужно создавать подклассы, которые происходят из PropertyDescriptor, и делать то, что я указал с переопределением GetValue и SetValue. Это примерно такое же количество работы. Однако для реализации ICustomTypeDescriptor существует более общее использование, поэтому я бы пошел с этим. – casperOne
Но с ICustomTypeDescriptor вам нужно контролировать отображаемый тип, а не только сетку. –