中止正在等待Read()语句的线程(C#套接字编程)

中止正在等待Read()语句的线程(C#套接字编程),c#,multithreading,sockets,C#,Multithreading,Sockets,我有一个用于TCP-IP客户端的WinForms应用程序。一旦客户机连接到本地主机服务器,我就启动一个线程t1,它以无限循环的方式进入,以保持从服务器接收消息 当服务器不发送任何消息时,线程在语句m_DeviceServerStream.Read(instream,0,buffersize)处无限等待如下面的代码所示 Thread t1; TcpClient m_DeviceClientSocket = new TcpClient(); NetworkStream m_DeviceSer

我有一个用于TCP-IP客户端的WinForms应用程序。一旦客户机连接到本地主机服务器,我就启动一个线程
t1
,它以无限循环的方式进入,以保持从服务器接收消息

当服务器不发送任何消息时,线程在语句
m_DeviceServerStream.Read(instream,0,buffersize)处无限等待如下面的代码所示

Thread t1;
TcpClient m_DeviceClientSocket = new TcpClient();
    NetworkStream m_DeviceServerStream = default(NetworkStream);

public void StartClient()
{
    m_DeviceClientSocket.Connect(m_DeviceURL, m_DevicePort);
    m_DeviceServerStream = m_DeviceClientSocket.GetStream();

    t1 = = new Thread(KeepReceiveingMessages);
    t1.Start();
}

public void StopClient() //On Stop Button-click
{
    t1.Abort();
}

public void KeepReceiveingMessages()
{
    while(true)
    {
        _dataServiceConnected.Waitone()
        try
        {
            var buffersize = m_DeviceClientSocket.ReceiveBufferSize;
            byte[] instream = new byte[buffersize];

            m_DeviceServerStream.Read(instream, 0, buffersize) //THREAD T1 KEEP WAITING HERE TILL A MESSAGE IS RECEIVED FROM THE SERVER
        }
        catch(Exception e)
        {                       
           _dataServiceConnected.Reset(); //do not try to eneter again till we have a working connection
        }
    }
}
问题:如果我想关闭客户端应用程序,那么我想优雅地完成线程。但是我发现,即使调用
t1.Abort()
,线程
t1
也会继续运行(如Visual Studio线程调试窗口所示),那么我应该如何结束线程呢?

您应该使用等待超时。如果WaitOne(int32)返回false,则表示超时已过期,且事件未发出信号。然后,您可以检查是否需要优雅地退出线程

private bool volatile shouldCancel; //Dirty, but will work on Intel hardware :-)

public void KeepReceiveingMessages()
{
    while(true)
    {
        bool signaled = _dataServiceConnected.Waitone(100);
        if (!signaled && shouldCancel) return;
        try
        {
            var buffersize = m_DeviceClientSocket.ReceiveBufferSize;
            byte[] instream = new byte[buffersize];

            m_DeviceServerStream.Read(instream, 0, buffersize) //THREAD T1 KEEP WAITING HERE TILL A MESSAGE IS RECEIVED FROM THE SERVER
        }
        catch(Exception e)
        {                       
           _dataServiceConnected.Reset(); //do not try to eneter again till we have a working connection
        }
    }
}

关闭小溪。有关异步版本,请参阅。@GSerg:我关闭了流并调用了
t1.Join(1000)但是线程仍然在运行。我只是在为另一个帖子查看类似的代码。我发现如下内容:if(ns.DataAvailable)ns.Read(新字节[100],0100);请参见@skm关闭流时,
Read
调用返回。因为您有一个无限循环,所以会再次调用它,这会引发一个异常,因为流已关闭。如果未观察到该异常,则表示这不是您正在运行的实际代码。@GSerg:我确实有catch块,一旦关闭流,线程就进入catch块。但是,我仍然无法中止线程(可能是因为我在while循环的开头有一个
Waitone()语句)。我已经在帖子中更新了我的代码。