2012-02-08 6 views
1

私はウィンドウ形式です。コンストラクタサーバスレッドがTCPリスナーループがあるサーバスレッドでサーバのスレッドの修正が完了しました。

thServer = new Thread(ServerThread); 
thServer.Start(); 

を開始します。私は、メインフォームを閉じると

while (true) { 
    TcpClient client = server.AcceptTcpClient(); 
    ... 
    } 

、このスレッドは、れるtcpClientの要求を待ち続けます。どうすればこのルーチンを止めることができますか? ありがとうございます。

+0

ところで、あなたに "(C#の)" を追加する必要はありません。タイトル。それがタグのためのものです。 –

答えて

1
public partial class Form1 : Form 
{ 
    Thread theServer = null; 

    public Form1() 
    { 
     InitializeComponent(); 

     this.FormClosed += new FormClosedEventHandler(Form1_FormClosed); 

     theServer = new Thread(ServerThread); 
     theServer.IsBackground = true; 
     theServer.Start(); 

    } 

    void ServerThread() 
    { 
     //TODO 
    } 

    private void Form1_FormClosed(object sender, FormClosedEventArgs e) 
    { 
     theServer.Interrupt(); 
     theServer.Join(TimeSpan.FromSeconds(2)); 
    } 
} 
+0

私はそれが正しいコードだと思います。しかし、私のアプリケーションfuncを閉じると、Form1_FormClosed()は呼び出されません。(デバッグ中にチェックしました) –

+1

FormClosedイベントをキャッチする方法を示すために更新されました。 – ahazzah

1

最も簡単な方法は、バックグラウンドスレッドとしてスレッドをマークすることです - あなたのメインフォームが閉じたときに、それが実行しているプロセスを維持しません。

一つのアプローチは、追加することです
thServer = new Thread(ServerThread); 
thServer.IsBackground = true; 
thServer.Start(); 

MSDN: Thread.IsBackground

0

whileループの条件として機能するフラグ。 もちろん、あなたのThreadオブジェクトのIsBackgroundプロパティを設定することもできますが、クリーンアップコードを実行したいかもしれません。

例:

class Server : IDisposable 
{ 
    private bool running = false; 
    private Thread thServer; 

    public Server() 
    { 
     thServer = new Thread(ServerThread); 
     thServer.Start(); 
    } 

    public void Dispose() 
    { 
     running = false; 
     // other clean-up code 
    } 

    private ServerThread() 
    { 
     running = true; 
     while (running) 
     { 
      // ... 
     } 
    } 
} 

使用法:

using (Server server = new Server()) 
{ 
    // ... 
} 
0

Here's the solution to this exact same problem.(SimpleServerとクラスを見てみましょう)

アイデアがTcpClientを停止するので、AcceptTcpClientの呼び出しが中止されます。 AcceptTcpClientへの呼び出し後、ソケットがまだ開いているかどうかを確認する必要があります。

0

フォームが閉じようとしていることを示す特別なブール変数を作成します。バックグラウンドスレッドでその値をチェックし、ループが真であるときにループを解除します。メインフォームで変数の値をtrueに設定し、thServer.Join()を呼び出してスレッドの完了を待ちます。その後、 フォームを安全に閉じることができます。フォームを閉じるハンドラで

:サーバスレッドのループでは

abortThread = true; 
thServer.Join(); 

:このような何か

while (true) 
{ 
    if (abortThread) 
     break; 

    TcpClient client = server.AcceptTcpClient(); 
    ... 
} 
+1

'AcceptTcpClient'が既に呼び出されている場合、これは問題を解決しません。 – alf

+0

私はそれを試しました。クライアントがない場合、サーバースレッドは待機モードになります –

関連する問題