我有窗体。在构造函数服务器线程启动
thServer = new Thread(ServerThread);
thServer.Start();
在服务器线程中有TCP侦听器循环:
while (true) {
TcpClient client = server.AcceptTcpClient();
...
}
当我关闭主窗体时,该线程继续等待TCPClient的请求。我怎么能停止这个例行程序? 谢谢。
答案 0 :(得分:1)
最简单的方法是将线程标记为后台线程 - 然后当主窗体关闭时,它不会让您的进程保持运行:
thServer = new Thread(ServerThread);
thServer.IsBackground = true;
thServer.Start();
答案 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();
...
}