2012-04-12 11 views
5

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.

+0

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

+1

@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

Odpowiedz

3

Nie ma pojedynczego elementu, na który można patrzeć, aby określić, czy obiekt musi zostać wywołany ze STA/głównego wątku aplikacji. To po prostu coś, co jest nieodłącznie związane z umową indywidualnego typu:

W związku z tym istnieją pewne wskazówki, których możesz szukać. Są wskazywałby obiekt jest elementem związany UI, ale w żadnym wypadku nie jest to ostateczną listę

  • wywodzi System.Windows.Forms.Control
  • wywodzi się z UIElement
Powiązane problemy