2012-02-29 4 views
1

한 스레드에서 다른 스레드로 NetworkStream.BeginRead()와 WinForms 클래스 사이에서 통신하는 데 심각한 문제가 있습니다 (스레딩 및 비동기 호출과 같은 항목에서는 실제 초보자입니다).C# Winforms 및 NetworkStream.BeginRead(), 네트워크 이벤트를 기반으로 새 양식을 여는 방법은 무엇입니까?

특히, 이벤트를 수신하기 만하면 네트워크 소켓을 통해 원격 클라이언트에 연결됩니다. 하나를 받으면 올바르게 NetworkStream의 BeginRead() 및 EndRead() 메서드를 사용하여 문제없이 문자열로 수집 할 수 있습니다. 그런 다음 정보를 사용자에게 표시 할 수 있도록 양식 (양식 생성자에서 매개 변수로 문자열 사용)을 열려고합니다. 실제로 네트워크 이벤트는 사용자가 열 수있는 양식과 정보를 트리거합니다.하지만 CrossThreadMessagingExceptions를 계속 방문하고 있으며, 내가 올바르게 수행하고 있음을 확신하는 대표단에 익숙하지 않습니다. 누군가 올바른 방향으로 나를 가르 킬 수 있습니까?

답변

1

규칙은 "할 수 있습니다 자신이 만든되는 스레드에서만 액세스 제어"

당신은 당신이 원하는 경우 UI 스레드에 다시 마샬링 할 필요가 있도록 비동기 콜백은, 다른 스레드에 돌아오고있다 양식 들간의 의사 소통.

코드가 이미 양식에 있다고 가정하면 Invoke 또는 BeginInvoke를 사용해야합니다.

private void MyAsyncCallback(IAsyncResult ar) 
{ 
    var yourString = ...from your socket...; 
    this.Invoke(new MethodInvoker(() => new Form(yourString))); 
} 
: 예를 들어,