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

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

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

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

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

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

5
задан Stephen Swensen 12 April 2012 в 14:18
поделиться