我正在用c#编写一个tcp服务器应用程序。我设计了一个名为TcpCommunication的类来实现服务器。 TcpCommunication持有下一个成员:
private TcpListener tcpListener;
private TcpClient clientObj;
private Thread listenThread;
和connect()方法:
public bool Connect()
{
...
listenThread = new Thread(new ThreadStart(ListenForClients));
listenThread.IsBackground = true;
listenThread.Start();
...
}
ListenForClients方法实现如下:
private void ListenForClients()
{
while (true)
{
try
{
//blocks until a client connects to the server
clientObj = tcpListener.AcceptTcpClient();
//create a thread to handle communication with connected client
Thread clientThread = new Thread(new ThreadStart(Receive));
clientThread.IsBackground = true;
clientThread.Start();
}
...
}
}
在某些情况下(当用户决定时)我想停止收听新客户端并停止为现有客户端提供服务。 我的问题是:当他们的创建者线程(不是主线程)中止时,所有子线程都会中止吗? 我是否需要保存所有线程的集合并逐个中止它们或者进行下一次实施?
public bool Disconnect()
{
if (listenThread != null)
{
listenThread.Abort();
listenThread.Join();
}
tcpListener.Stop();
return true;
}
答案 0 :(得分:1)
您需要考虑使用本身提供多线程支持的异步套接字。因此,您不需要管理线程。见这个例子:
答案 1 :(得分:0)
线程没有任何关系,你可以按任何顺序杀死它们。你应该保留一个你创建的线程列表,我不会那么勇敢地杀死一个应用程序中的所有线程,框架也可能创建一些。如果我是你,我会在循环中中止所有这些,然后在第二个循环中加入所有这些,以使其更快。
答案 2 :(得分:0)
如果你处于阻塞模式,则下层服务器套接字会阻塞该线程,因为它是一个同步WIN32操作。
你不需要一个线程:
public static void StartTcpListener(TcpListener listener)
{
try
{
listener.Server.Blocking = false;
listener.BeginAcceptTcpClient(
ar =>
{
TcpClient client = listener.EndAcceptTcpClient(ar);
},
listener);
}
catch
{
// catch exceptions on close, e.g.
}
}
如果在侦听时关闭该套接字,则在大多数情况下会抛出异常,因为在该示例中上下文被try-catch块包围。
答案 3 :(得分:0)
当创建者线程(不是主线程)中止时,所有子线程都会中止吗?
否,即使所有者线程退出,它们也可以运行。线程B在线程A中创建并启动,并不意味着线程B是线程A的一部分。
我是否需要持有所有线程的集合并逐个中止它们或者进行下一次实施?
从你的问题我认为你需要。 (如果我的理解是正确的)在服务器端,您只有一个ListenForClients
的线程,其中将创建一些clientThread
,因为许多客户端将连接到您的服务器。但在Disconnect
方法中,只有listenThread
被中止,这意味着很多clientThread
可能仍在运行。