2012-04-30 13 views
0

私はTCPサーバーアプリケーションを持っており、TCPクライアントと通信するためのスレッドを持っています。クライアントからデータを受け取ると、このデータを使って新しいフォームを作成したいが、スレッドでフォームを作成することはできない。ボタンクリックイベントを使用してフォームを簡単に作成できます。C#新しいフォームをスレッドで作成する

どこが間違っていますか?

ありがとうございます。

答えて

4

このような状況を回避するには、元のUIスレッドが新しいフォームの作成を処理し、複数のUIスレッドを持たないようにする方がよいでしょう。幸いにも、そのスレッドで操作を呼び出すことができます。

WinFormsでの操作方法はhere、WPF/Silverlightでの操作方法についてはhereを参照してください。

+1

-1。事実上間違っている。私はしばしばそれを見ます - 申し訳ありません - プログラマーは話を何も知らない。 ANYスレッドは、ディスパッチャーを実行するときにongとしてフォームを開くことができます。それを作成するのは簡単です。私はここでは、メインのウィンドウ(それらのうちの8つは時々重いデータ処理を行う)を実行するごとに1つのスレッドを持っているアプリを持っている。 http://stackoverflow.com/questions/4698080/spawn-a-new-thread-to-open-a-new-window-and-close-it-from-a-different-threadにはコード例があります。フォーム作成メソッドはフォームを開き、ディスパッチャを実行します。簡単。 – TomTom

+0

@TomTom - もちろん、他のスレッドはUIスレッド、ウィンドウの作成、メッセージの取得/送信が可能です。できない場合は、1つのプロセスしかありません:)この場合、クライアントスレッドwoldはメッセージを処理するディスパッチャを実行する必要があります。ブロッキングコールを行う必要がない場合は問題ありません。 OPケースでは、クライアントごとにGUIスレッドを実行するのが良いかどうかはわかりません。 –

+0

私も。しかし、それはポイントではありません - 答えは単に間違っていました。「THE」スレッドのみがフォームを作成できることを示しています。 – TomTom

0

新しいフォームを作成するためにGUIスレッドにコンテキストを変更する必要があります。どこかでBeginInvoke()を行う必要があります。

これはどの種類のサーバーですか?リスニングスレッドが1つの「クラシック」同期サーバーと、クライアント接続ごとにサーバー<>クライアントスレッドです。

クライアント接続時にフォームを作成したくない場合は、接続されたクライアントが具体的に尋ねる場合にのみこのフォームを作成します。

1

仕事をするためのサンプルコード:

private void Button1_Click(object sender, EventArgs e) 
{ 
    Thread t1 = new Thread(StartMe); 
    t1.Name = "Custom Thread"; 
    t1.IsBackground = true; 
    t1.Start(); 
} 

private void StartMe() 
{ 
    //We are switching to main UI thread. 
    TextBox1.Invoke(new InvokeDelegate(InvokeMethod), null); 
} 

public void InvokeMethod() 
{ 
    //This function will be on main thread if called by Control.Invoke/Control.BeginInvoke 
    MyForm frm = new MyForm(); 
    frm.Show(); 
} 
+0

VBからC#にコードを変換してみてください。 –

+0

言語を変換するにはhttp://www.developerfusion.com/tools/convert/vb-to-csharp/を使用してください –

関連する問題