TCPサーバーアプリがあり、TCPクライアントと通信するためのスレッドがあります。クライアントからデータを受け取ったら、このデータを使用して新しいフォームを作成したいのですが、スレッドでフォームを作成できません。ボタンクリックイベントを使用してフォームを簡単に作成できます。
私はどこが間違っていますか?
ありがとうございました。
TCPサーバーアプリがあり、TCPクライアントと通信するためのスレッドがあります。クライアントからデータを受け取ったら、このデータを使用して新しいフォームを作成したいのですが、スレッドでフォームを作成できません。ボタンクリックイベントを使用してフォームを簡単に作成できます。
私はどこが間違っていますか?
ありがとうございました。
このような状況を回避するには、アプリケーションの元のUIスレッドに新しいフォームの作成を処理させ、複数のUIスレッドを持たないようにすることをお勧めします。幸い、そのスレッドで操作を呼び出すことができます。
WinFormsで実行する方法については、こちらを参照してください。WPF / Silverlightで実行するには、こちらを参照してください。
仕事をするためのサンプルコード:
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();
}
新しいフォームを作成するには、どこかでコンテキストをGUIスレッドに変更する必要があります。どこかで、BeginInvoke()を実行する必要があります。
これはどのような種類のサーバーですか?クライアント接続ごとに1つのリスニングスレッドとserver <>クライアントスレッドがある「クラシック」同期サーバーですか?
クライアント接続時にフォームを作成するのではなく、接続されたクライアントが具体的に尋ねた場合にのみこのフォームを作成します。