Ссылка this Проблема FsEye, как я могу использовать отражение, чтобы определить, требуется ли объекту для его членов (или даже конкретного члена, если это возможно) в графическом интерфейсе?Использование рефлексии для определения необходимости вызова объекта для потока GUI
Сценарий таков: пользователь создает экземпляр объекта WebBrowser
в FSI (который запускает собственный цикл событий WinForms), затем они пытаются развернуть узел в FsEye. Но это приводит к необработанным диалоговом окне предупреждения исключение, что
System.Threading.ThreadStateException: Текущий поток должен быть установлен в режим одной нити квартиры (STA), прежде чем OLE вызовы могут быть сделаны. Убедитесь, что на вашей основной функции отмечен символ STAThreadAttribute.
(особенно это происходит при загрузке только свойства AccessibilityObject).
Я знаю, что это происходит потому, что FsEye загружает дочерних узлов лениво, асинхронно, и параллельно с использованием F # асинхронной вычисления выражения с Async.Parallel
и, таким образом, вызывая членов этого объекта OLE из неоригинальных, не-STA (т.е. не оригинальная резьба GUI FSI). Я также знаю, как это исправить, переключившись на контекст контекста GUI в моих асинхронных выражениях, но я бы хотел сделать это только при необходимости.
Does [ 'InvokeRequired' ] (http://msdn.microsoft.com/en-us/library/system.windows.forms.control.invokerequired.aspx) help? – Daniel
@ Даниэль, я так не думаю, что он просто скажет ему, что он не в потоке пользовательского интерфейса ... он знает, что он не в потоке пользовательского интерфейса, он хочет знать, должен ли этот случайный объект здесь использовать пользовательский интерфейс нить, чтобы оценить себя. – Brian