正确完成服务器线程

时间:2012-02-08 14:07:09

标签: c# multithreading sockets

我有窗体。在构造函数服务器线程启动

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

在服务器线程中有TCP侦听器循环:

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

当我关闭主窗体时,该线程继续等待TCPClient的请求。我怎么能停止这个例行程序? 谢谢。

5 个答案:

答案 0 :(得分:1)

最简单的方法是将线程标记为后台线程 - 然后当主窗体关闭时,它不会让您的进程保持运行:

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

MSDN: Thread.IsBackground

答案 1 :(得分: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 ) );
    }
}

答案 2 :(得分: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())
{
    // ...
}

答案 3 :(得分:0)

Here's the solution to this exact same problem.(看一下SimpleServer类)

想法是停止TcpClient,因此对AcceptTcpClient的调用将中止。在调用AcceptTcpClient之后,您可能需要询问套接字是否仍处于打开状态。

答案 4 :(得分:0)

制作特殊的布尔变量,表明表格即将关闭。检查它在后台线程中的值,并在它为真时中断循环。在main form中,将变量值设置为true,并调用thServer.Join()以等待线程完成。然后你可以安全地关闭 形成。像这样:

在表单关闭处理程序中:

abortThread = true;
thServer.Join();

在服务器线程循环中:

while (true)
{
   if (abortThread)
      break;

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