2011-01-12 5 views
6

내 응용 프로그램에는 서버의 메시지를 수신하고 수신하는 내용에 따라 동작하는 스레드가 있습니다.다른 스레드의 새로운 형식

서버에서 메시지를 보내고 싶을 때 클라이언트 응용 프로그램에서 클라이언트 응용 프로그램이 수신 할 때 클라이언트 응용 프로그램이 새 양식을 열 때 문제가 발생했습니다. 그러나이 새로운 형태는 즉시 결빙됩니다.

나는 서버에서 수신 대기하는 스레드와 동일한 스레드에 새로운 양식이로드되는 것을 생각합니다. 물론 스트림에서 수신 대기 중이며 스레드를 차단하고 있습니다.

일반적으로 클라이언트가 듣고있는 스레드에서 다른 기능을 사용하려면 기본 폼의 UI를 업데이트하기 위해 호출을 사용합니다. 그래서 내가 원하는 것은 다음과 같은 경우에 새 폼을 호출하는 방법이 무엇인지 묻는 것입니다 주요 양식.

답변

15

저는 이것이 WPF가 아닌 Windows Forms라고 가정합니까? 백그라운드 스레드에서 폼, 컨트롤 등을 만들거나 조작하지 마십시오. 이것은 메시지 루프가 실행 중이고 Windows 메시지를 처리 ​​할 수있는 주 스레드에서만 작동합니다.

그래서 대신 백그라운드 스레드의 주 스레드에서 실행하는 코드를 얻으려면, 당신은 너무처럼 Control.BeginInvoke 방법을 사용할 수 있습니다

private static Form MainForm; // set this to your main form 

private void SomethingOnBackgroundThread() { 

    string someData = "some data"; 

    MainForm.BeginInvoke((Action)delegate { 

     var form = new MyForm(); 
     form.Text = someData; 
     form.Show(); 

    }); 
} 

염두에 두어야 할 점은 그 경우 백그라운드 스레드는 주 스레드로부터 응답을 필요로하지 않으므로 Invoke가 아닌 BeginInvoke를 사용해야합니다. 그렇지 않으면 주 스레드가 백그라운드 스레드에서 대기 중일 때 교착 상태가 될 수 있습니다.

0

기본적으로 직접 대답을했습니다. Invoke를 사용하여 GUI 스레드에서 양식을 작성하는 코드를 실행하십시오.

관련 문제