2013-07-25 3 views
0

서비스 참조에서 일부 데이터를 수신했습니다.WCF (WPF) 오류 : 호출 스레드가 STA 여야합니다.

구조체 f.e.
서비스 참조 (namespace : ServiceReference.Driver)에서 일부 드라이버 데이터를 수신했습니다.
내 프로젝트의 driverdata의 네임 스페이스는 'MyProject.Driver'입니다.

DriverUserControl은 MyProject.Driver의 생성자에서 만들어야합니다. 내가 여기에 도착하면

public Driver(int id, string name, string telephone, string plate, 
        Dictionary<DateTime, TransportType> transportTypes, Division division) 
    { 
     this.id = id; 
     this.name = name; 
     this.telephone = telephone; 
     this.plate = plate; 
     this.transportTypes = transportTypes; 
     this.division = division; 
     userControl = new DriverUserControl(this); 
    } 

는 그러나 "많은 UI 구성 요소이 필요하기 때문에, 호출 스레드는 STA해야한다"는 다음과 같은 오류 해당 UserControl의 생성자에 도달 할 때마다

public DriverUserControl(Driver magnet) 
    { 
     InitializeComponent(); 

     this.magnet = magnet; 
     Render(); 
    } 

을 보여줍니다.

내 프로젝트에서 아무 곳에서나 스레드를 시작한 적이 없기 때문에 STA로 설정하는 방법을 모르겠습니다. 나는 servicereference가 스레드로 여겨지지만, 여전히, 이것을 STA로 변경하는 방법이 있습니까?

감사합니다.

+0

왜 'Driver' 클래스에서 Usercontrol을 만들겠습니까? – Jobo

+0

'Driver' 객체는 어디에 생성됩니까? 이 모든 것에서 ServiceReference의 역할은 무엇입니까? 분명하지 않아. – YK1

+0

Driver 생성자가 호출 된 스레드는 무엇입니까? MainStore가 STA인지 여부를 확인하려면 디버깅해야합니다. 그렇지 않으면 수동으로 STA 스레드를 만들어야합니다. –

답변

1

컨트롤이 어떻게 인스턴스화됩니까? 프로그램이 시작될 때 또는 WCF 서비스에서 들어오는 호출을 듣고 있습니까?

일반적으로, WPF 또는의 WinForm 응용 프로그램의 메인 쓰레드 그래서 내가 의심 이미 STA (당신이 그것을 검색 할 경우는 STAThreadAttribute 코드 생성 된 파일에 Main 메서드에 적용 찾을 수)

입니다 들어오는 wcf 호출에 대한 응답으로 제어를 인스턴스화합니다. 그게 맞습니까?

Windows의 모든 UI 창에는 스레드 선호도가 있습니다. 즉, 스레드 친화도가 생성 된 스레드 만 대화 가능합니다. 일반적으로이 작업은 메인 스레드에서 창이나 컨트롤 만 생성하면됩니다. 따라서 백그라운드 스레드는 UI 컨트롤의 멤버를 직접 만져서는 안됩니다.

따라서 메인 스레드에서 사용자 정의 컨트롤을 생성해야합니다. 가장 쉬운 방법은이 작업을 수행 : 를 이미 사용자 컨트롤이 배치 될 예정이다 형태/윈도우에 액세스 할 수있는 경우, 다만 사용

TheWindowHostingTheControl.Dispatcher.Invoke (or BeginInvoke, or one of the AsyncInvokes), passing in a delegate to the code that instances your control. that will cause the control to be created on the same thread that the host window has affinity for. 

당신은 같은 일을 어떤 시각을을 수행해야합니다 웹 서비스에서 들어오는 호출은 컨트롤의 속성을 업데이트해야합니다 (당연히 컨트롤과 연결된 Dispatcher 인스턴스를 사용할 수도 있습니다).

이것은 들어오는 wcf 호출에 응답한다는 가정을 기반으로합니다. (내가 너를 궤도에서 내 보낸다면 미안해).

+0

네, 맞습니다.드라이버가 WCF 서비스의 콜백에서 인스턴스화됩니다. 나는 이것을 시험해보고있다. 나는 그것이 고정되어 있는지 알려준다. :) thx –