中止正在等待Read()语句的线程(C#套接字编程)
我有一个用于TCP-IP客户端的WinForms应用程序。一旦客户机连接到本地主机服务器,我就启动一个线程中止正在等待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
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()语句)。我已经在帖子中更新了我的代码。