2012-02-07 4 views
1

WPF C#. 다른 메서드에 바인딩하는 메서드가 있습니다. 서버에서 Hello World를 보냅니다.WPF 멀티 스레딩. 타사 흐름의 인터페이스 변경

var clientobj = 
(OperClass) Activator.GetObject 
(
typeof (OperClass), 
"tcp ://localhost: 100001/TcpClient" 
); 

clientobj.Update ("HELLO WORLD"); 

클라이언트 응용 프로그램 :

public void Update (string msg) 
{ 
    label1.text = msg;// error thread 
} 

프로그램이 통신 RemotingServices.Marshal에 사용됩니다. 텍스트를 label1로 어떻게 바꿀 수 있습니까? 운영자이 도움이되지 않습니다.

+0

오류 당신은 무엇을 얻을 수있다 :

clientobj 자체의 UI 요소가되는 가정 (예 : Window A와 또는 UserControl), 당신은 다음과 같은 코드를 사용 할 수 있습니까? 'label1.Text'를 설정할 때 스레드 간 오류입니까? –

+0

예.이 오류를 수정했습니다. 항목이 해당 스레드에서 생성되지 않았기 때문에 제어 흐름을 가져올 수 없습니다. – Feor

답변

1

UI 요소가 작성된 스레드가 아닌 스레드에서 UI 요소에 액세스 할 수 없습니다. 이를 극복하려면 UI 요소가 작성된 Dispatcher 스레드에서 필요한 것을 호출해야합니다.

public void Update (string msg) 
{ 
    // See if we need to re-invoke on the Dispatcher thread 
    if (!CheckAccess()) 
    { 
     // Invoke on the Dispatcher thread 
     this.Dispatcher.BeginInvoke(new Action<string>(Update), msg); 

     // Exit from this method to prevent continued execution 
     return; 
    } 

    // We are now running on the Dispatcher thread, so we can access the UI element(s) directly 
    label1.Text = msg; 
} 
+0

프로그램이 작동했습니다. 처음에는 그 상태에 포함 된 방법이 왔습니다. 그런 다음 UI의 이름을 바꾸는 메소드를 다시 호출하십시오. 그러나 프로그램은 바뀌지 않았습니다. 어쩌면 당신이 업데이 트를 호출해야합니까? – Feor

+0

@Feor 내가 무슨 뜻인지 잘 모르겠다. –

+0

코드가 작동했습니다. 하지만 인터페이스 변경 사항에서는 그렇지 않습니다. 오류는 없었지만. 미안해, 내 영어로. – Feor