Odwoływanie się do problemu FsEye, jak używać odbicia, aby określić, czy obiekt potrzebuje wywoływania jego członków (lub, w rzeczy samej, konkretnego członka, jeśli to możliwe) w wątku GUI?Korzystanie z odbicia w celu ustalenia, czy obiekt potrzebuje wywoływania swoich członków na wątku GUI:
Scenariusz jest następujący: użytkownik tworzy instancję obiektu WebBrowser
w FSI (która uruchamia własną pętlę zdarzeń WinForms), a następnie próbuje rozszerzyć węzeł w FsEye. Ale to wynika w oknie dialogowym wyjątek nieobsługiwany ostrzeżenie, że
System.Threading.ThreadStateException: Obecny wątek musi być ustawiony w trybie pojedynczej nici apartament (STA) przed OLE można nawiązywać połączenia. Upewnij się, że na głównej funkcji jest zaznaczony atrybut STAThreadAttribute.
(w szczególności pojawia się to podczas ładowania właściwości AccessibilityObject).
wiem, że to dlatego, FsEye ładunki dziecko węzłów leniwie, asynchronicznie, a równolegle za pomocą F # obliczeń asynchroniczny wyraz z Async.Parallel
a więc powołuje członków tego obiektu OLE z nieoryginalnych, non-STA (czyli nie jest oryginalny wątek FSI GUI) wątki puli wątków. Wiem również, jak to naprawić, przełączając się do kontekstu wątku GUI w moich wyrażeń asynchronicznych, ale chciałbym to zrobić tylko wtedy, gdy jest to absolutnie konieczne.
Does [ 'InvokeRequired' ] (http://msdn.microsoft.com/en-us/library/system.windows.forms.control.invokerequired.aspx) pomóc? – Daniel
@Daniel, nie sądzę, że po prostu powie mu, że nie ma go w wątku UI ... wie, że nie ma go w wątku UI, chce wiedzieć, czy ten losowy obiekt tutaj będzie musiał użyć interfejsu użytkownika wątek do oceny samego siebie. – Brian