2012-04-12 4 views
5

참조 this FsEye 문제, 객체를 호출하여 객체가 멤버 (또는 가능하면 특정 멤버)를 필요로하는지 여부를 결정하는 방법은 무엇입니까? GUI 스레드에서?리플렉션을 사용하여 객체가 GUI 스레드에서 호출 될 멤버를 필요로하는지 결정

시나리오는 다음과 같습니다. 사용자가 자신의 WinForms 이벤트 루프를 실행하는 FSI 내에 WebBrowser 개체의 인스턴스를 만든 다음 FsEye에서 노드를 확장하려고 시도합니다. OLE는 할 수 호출하기 전에 현재의 thread가 단일 스레드 아파트 (STA) 모드로 설정해야하지만 그

System.Threading.ThreadStateException이 있음을 경고 처리되지 않은 예외 대화 상자에서 발생합니다. Main 함수에 STAThreadAttribute가 표시되어 있는지 확인하십시오.

(특히 이것은 AccessibilityObject 속성 만로드 할 때 나타납니다.)

나는 FsEye로드 아이가 정품이 아닌, 비 STA (에서이 OLE 개체의 멤버를 호출하는 때문에 비동기, 게으르게 노드 및 병렬에 Async.Parallel와 F 번호 비동기 계산 식을 사용하고 있기 때문에이 알고 즉,하지 원래 FSI GUI 스레드) 스레드 풀 스레드. 또한 비동기 표현식 내에서 GUI 스레드 컨텍스트로 전환하여이를 해결하는 방법을 알고 있지만 절대적으로 필요한 경우에만 수행하려고합니다.

+0

합니까 ['InvokeRequired'에서 파생되는 최종 목록을하다 ] (http://msdn.microsoft.com/en-us/library/system.windows.forms.control.invokerequired.aspx) help? – Daniel

+1

@Daniel, 나는 그렇게 생각하지 않는다. UI 스레드가 아니라는 것을 알게 될 것이다 ... UI 스레드가 아니라는 것을 알고있다. 여기에있는이 임의의 오브젝트가 UI를 사용해야하는지 알고 싶어한다. 스레드 자체를 평가할 수 있습니다. – Brian

답변

3

응용 프로그램의 STA/주 스레드에서 개체를 호출해야하는지 확인할 수있는 단일 구성원이 없습니다. 그것은 개인 유형의 계약에 고유 한 것입니다.

당신이 찾을 수있는 단서가 있다고합니다. 객체를 나타냅니다 이들은 UI 바인딩 구성 요소입니다하지만 결코이

  • System.Windows.Forms.Control
  • 에서 파생 UIElement에
관련 문제