2011-01-12 5 views
6

私は自分のアプリケーションにスレッドを持っています。その目的は、サーバーからのメッセージをリッスンし、受け取った内容に従って動作させることです。別のスレッドの新しいフォーム

サーバーからメッセージを出したいときに問題が発生しました。クライアントアプリケーションがメッセージを受信すると、クライアントアプリケーションは新しいフォームを開きます。しかし、この新しいフォームはただちにフリーズします。

私は、新しいフォームが、サーバーをリッスンしているスレッドと同じスレッドにロードされていると考えています。もちろん、ストリームをリッスンしてスレッドをブロックしています。

通常、スレッドをリッスンしているクライアントの私の他の機能のために、私は主フォームのUIを更新するために呼び出しを使用したいので、ここでは新しいフォームを呼び出す方法があるかと思いますメインフォーム。

答えて

15

これはWindowsフォームでWPFではないと仮定していますか?あなたのバックグラウンドスレッドからは、フォームやコントロールなどを作成したり操作したりしないでください。これは、メッセージループが実行され、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(); 

    }); 
} 

主なものであればということですバックグラウンドスレッドはメインスレッドからの応答を必要としませんので、InvinではなくBeginInvokeを使用してください。それ以外の場合は、メインスレッドがバックグラウンドスレッドで待機中であれば、デッドロックになる可能性があります。

0

あなたは基本的に自分で答えを出しました。コードを実行して、Invokeを使用してGUIスレッドでフォームを作成するだけです。

関連する問題