2010-07-01 3 views
1

스피에 기초하지만, 스피 받고 다음과 같은 오류 :Windows 워크 플로 윈도우 프리젠 테이션 파운데이션 워크 플로 컴 서비스 에서 WPF 창을 만들려고

System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.InvalidOperationException: The calling thread must be STA, because many UI components require this. 
    at System.Windows.Input.InputManager..ctor() 
    at System.Windows.Input.InputManager.GetCurrentInputManagerImpl() 
    at System.Windows.Input.InputManager.get_Current() 
    at System.Windows.Input.KeyboardNavigation..ctor() 
    at System.Windows.FrameworkElement.FrameworkServices..ctor() 
    at System.Windows.FrameworkElement.EnsureFrameworkServices() 
    at System.Windows.FrameworkElement..ctor() 
    at System.Windows.Controls.Control..ctor() 
    at System.Windows.Window..ctor() 
    at PACIExpress.SelectLanguage..ctor() 

아무도 제발 도와 드릴까요?

답변

2

예외 상태를 정확하게 문제 : '워크 플로우 컴 서비스'는 WCF 또는 웹 서비스 같은 것을 모든 경우의

System.InvalidOperationException: The calling thread must be STA, because many UI components require this.

첫째, 그것은 사용자 인터페이스를 가질 수 데스크톱 응용 프로그램이 아닙니다.

어쨌든 앱은 STA 여야합니다.

MTA와 STA 사이의 차이 : WPF에 대한

Could you explain STA and MTA?

정보 및 STA : http://msdn.microsoft.com/en-gb/magazine/cc163328.aspx

그리고 당신은 진입 점 방법이있는 경우, 당신은 STAThread 속성을 사용하려면, 여기에 대한 참조 추가 정보 :

http://blogs.msdn.com/b/jfoscoding/archive/2005/04/07/406341.aspx http://msdn.microsoft.com/en-us/library/system.stathreadattribute.aspx

희망이 있습니다!

2

Kieren의 대답은 WPF에 STA 스레드가 필요한 반면 Workflow Foundation 스레드는 MTA 스레드라는 문제의 핵심을 설명합니다. Kieren의 대답은 문제를 해결하는 방법을 설명하지 않습니다.

MTA 스레드에서 WPF 콘텐츠에 액세스해야 할 때마다 콘텐츠에 액세스 할 수있는 STA 스레드를 만듭니다. 내가 잘 작동했다 둘 다이 두 가지 솔루션을 사용하고 있습니다 : WPF 개체가 현재 메서드 호출을 넘어 존재하는 필요가없는 경우

풀링 된 STA가

스레드를, 내가 쓴 STAThreadPool 클래스를 사용 . STAThreadPool은 System.Threading.ThreadPool의 기본 기능을 구현하지만 MTA 대신 스레드 STA를 만듭니다. 또한 사용자 작업 항목을 대기시킨 다음 해당 항목이 완료되기를 기다리는 RunOnSTAThread 메소드가 있습니다.

전용 STA 스레드

이 해결책이 더욱 오버 헤드를 갖지만 WPF 개체 여러 메소드 호출에있을 수있는 시간이 필요하다. 현재 스레드가 STA 경우에 대한 STA 스레드가있는 경우, 다만 사전에

  • 봐가 볼 수있는 동작을 실행

    1. : 다시이 경우에 의해 구현되는 "RunOnSTAThread"방법은있다 이 MTA 스레드 (사전을 잠글 수 있어야 함)
    2. STA 스레드가 발견되지 않은 경우 : STA 스레드를 만들고이를 사전에 추가하십시오.MTA 스레드를 해당

      1. 경우 :
      2. 에서, STA 스레드에서 작업을 실행하는 STA 스레드를 신호하고는

      각 STA 스레드를 완료 할 때까지 기다리 스토어에서이 작업을 수행 루프를 실행 살아 있지 않다면 출구를 닫으십시오.

    3. 조치가 실행 준비가되었다는 신호를 기다리십시오 (10 초 시간 초과). 타임 아웃 경우, 액션이 솔루션은 실제로 잘 작성된 STAThreadPool보다 코드 1

    단계를 완료

  • 이동이다 액션을 실행
  • 신호를 1
  • 단계로 이동하지만 적을 수 있습니다 스레드가 많은 경우 효율적입니다.

  • 관련 문제