代码之家  ›  专栏  ›  技术社区  ›  MadBoy

如何使tcpclient在线程中停止?

  •  1
  • MadBoy  · 技术社区  · 16 年前

    我有一个线程按照tcpconnect方法运行。我希望在任何给定时间通过将program.prepareExit设置为true来停止它。但是,我的程序仍停留在:
    Int32 bytes = stream.Read(data, 0, data.Length); 对程序没有真正的反应。PrepareExit设置为true。当我这么说的时候,我怎么能总是放弃呢?

        public static readonly Thread MyThreadTcpClient = new Thread(ThreadTcpClient);
        private static void ThreadTcpClient() {
            Connections.tcpConnect(ClientTcpIp, ClientTcpPort);
        }
    
             public static void Main() {
    
                 MyThreadTcpClient.Start();
                 .... some code....
                 Program.PrepareExit = true;
            }
    
        public static bool tcpConnect(string varClientIp, int varClientPort) {
            var client = new TcpClient();
            try {
                client = new TcpClient(varClientIp, varClientPort) {NoDelay = true};
                NetworkStream stream = client.GetStream();
                var data = new Byte[256];
                while (!Program.PrepareExit) {
                    Int32 bytes = stream.Read(data, 0, data.Length);
                    string varReadData = Encoding.ASCII.GetString(data, 0, bytes);
                    if (varReadData != "" && varReadData != "echo") {
                        VerificationQueue.EnqueueRelease(varReadData);
                    }
                }
            } catch (ArgumentNullException e) {
                MessageBox.Show(e.ToString(), "ArgumentNullException");
                tcpConnect(varClientIp, varClientPort);
            } catch (SocketException e) {
                MessageBox.Show(e.ToString(), "SocketException");
                tcpConnect(varClientIp, varClientPort);
            } catch (IOException e) {
                if (e.ToString() != "Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host.") {
                }
                MessageBox.Show(e.ToString());
                tcpConnect(varClientIp, varClientPort);
            } finally {
                client.Close();
            }
            return false;
        }
    
    1 回复  |  直到 16 年前
        1
  •  2
  •   Jon Skeet    16 年前

    有三种选择建议自己:

    • 使线程成为守护进程(后台)线程。当仅有的活动线程是守护进程线程时,进程将退出。
    • 设置读取调用的超时,可能需要更改才能使用底层的套接字API。说实话,那可不漂亮。
    • 使用异步IO。还有点疼。

    你需要这条线吗 任何东西 就有序关闭而言?如果没有,守护进程线程方法可能是最简单的。