2012-04-12 6 views
5

Ссылка this Проблема FsEye, как я могу использовать отражение, чтобы определить, требуется ли объекту для его членов (или даже конкретного члена, если это возможно) в графическом интерфейсе?Использование рефлексии для определения необходимости вызова объекта для потока GUI

Сценарий таков: пользователь создает экземпляр объекта WebBrowser в FSI (который запускает собственный цикл событий WinForms), затем они пытаются развернуть узел в FsEye. Но это приводит к необработанным диалоговом окне предупреждения исключение, что

System.Threading.ThreadStateException: Текущий поток должен быть установлен в режим одной нити квартиры (STA), прежде чем OLE вызовы могут быть сделаны. Убедитесь, что на вашей основной функции отмечен символ STAThreadAttribute.

(особенно это происходит при загрузке только свойства AccessibilityObject).

Я знаю, что это происходит потому, что FsEye загружает дочерних узлов лениво, асинхронно, и параллельно с использованием F # асинхронной вычисления выражения с Async.Parallel и, таким образом, вызывая членов этого объекта OLE из неоригинальных, не-STA (т.е. не оригинальная резьба GUI FSI). Я также знаю, как это исправить, переключившись на контекст контекста GUI в моих асинхронных выражениях, но я бы хотел сделать это только при необходимости.

+0

Does [ 'InvokeRequired' ] (http://msdn.microsoft.com/en-us/library/system.windows.forms.control.invokerequired.aspx) help? – Daniel

+1

@ Даниэль, я так не думаю, что он просто скажет ему, что он не в потоке пользовательского интерфейса ... он знает, что он не в потоке пользовательского интерфейса, он хочет знать, должен ли этот случайный объект здесь использовать пользовательский интерфейс нить, чтобы оценить себя. – Brian

ответ

3

Нет ни одного члена, на котором вы можете посмотреть, должен ли объект быть вызван из STA/основного потока приложения. Это что-то, что присуще контракту отдельного типа

Это, как говорится, есть определенные подсказки, которые вы можете найти. Это будет означать объект является UI связанный компонент, но ни в коем случае это окончательный список

  • производный от System.Windows.Forms.Control
  • производный от UIElement