使用TcpListener后的WSACancelBlockingCall

时间:2013-11-09 12:54:08

标签: c#

我有多线程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;?这是一个很好的决定吗?

0 个答案:

没有答案