我有多线程TcpListener。它是从按钮
开始的 private void startServer_Click(object sender, EventArgs e)
{
Server = new Thread(ServerThread);
Server.Start();
}
ServerThread的方法如下:
protected void ServerThread()
{
try
{
....;
serverListener = new TcpListener(localAddr, port);
serverListener.Start();
while (true)
{
Application.DoEvents();
while (!serverListener.Pending()) Thread.Sleep(500);
ConnectionThread newconnection = new ConnectionThread(mainClient);
}
}
catch (SocketException error)
{
.....;
}
finally
{
serverListener.Stop();
}
}
这里ConnectionThread类看起来像:
class ConnectionThread
{
public ConnectionThread(Action<object> methodWork)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(methodWork));
}
}
在这里我的方法工作如下:
public void mainClient(object state)
{
TcpClient client = serverListener.AcceptTcpClient();
NetworkStream stream = client.GetStream();
Byte[] bytes = new Byte[25600000];
String data = null;
int i;
while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
{
....
}
stream.Close();
client.Close();
}
毕竟我已经停止服务器按钮,看起来像:
private void stopServer_Click(object sender, EventArgs e)
{
Server.Abort();
serverListener.Server.Close();
serverListener.Stop();
}
一切都很好。在使用tcplistener并尝试停止它之后 - 它在1秒内停止并获得错误WSACancelBlockingError。我知道这个错误,因为我试图从另一个线程停止TcpListener。但我怎么能解决这个问题呢?制作动作&lt;&gt;?这是一个很好的决定吗?