C# 线程在C中突然停止工作#
我有一个多线程应用程序(C# 线程在C中突然停止工作#,c#,.net,multithreading,tcp,C#,.net,Multithreading,Tcp,我有一个多线程应用程序(TCPListener)。有一个线程,它查找请求列表,并在列表中有请求时发送数据。代码如下所示: private void HandleClientRequestsTask() { try { while (true) { if (ClientRequests.Count > 0) { ClientRequest ActiveClientR
TCPListener
)。有一个线程,它查找请求列表,并在列表中有请求时发送数据。代码如下所示:
private void HandleClientRequestsTask()
{
try
{
while (true)
{
if (ClientRequests.Count > 0)
{
ClientRequest ActiveClientRequest = ClientRequests.First();
int DataLen = ActiveClientRequest.CommPacket.PacketStr.Length;
int TxDataLen = 0;
try
{
TxDataLen = ActiveClientRequest.CommPacket.TCPClient.Client.Send(ConvertPacketToRawData(ActiveClientRequest.CommPacket.PacketStr));
}
catch (Exception ex)
{
AddLog(LogIndex.TCPClientNotExist, ex.ToString());
}
if (DataLen != TxDataLen)
AddLog(LogIndex.TCPClientDataSendErr, ActiveClientRequest.CommPacket.TCPClient.Client.RemoteEndPoint.ToString(), ActiveClientRequest.CommPacket.CmdType, ActiveClientRequest.CommPacket.RXDevID.ToString());
ClientRequests.Remove(ActiveClientRequest);
}
Thread.Sleep(HANDLE_CLIENT_REQ_TASK_SLEEP_VALUE);
}
}
catch (Exception ex)
{
AddLog(LogIndex.UnhException, ex.ToString());
}
}
我想上面的线突然停了。当我在if(ClientRequests.Count>0)
行上放置调试点时,程序不会停止,断点也不会被命中。当我暂停调试并查看threads窗口时,thread没有看到
你认为问题出在哪里?我认为,线程随时都会停止运行。如果确实需要两个try-catch块,请将外部try-catch移动到while循环中
我知道这是因为我在客户端看到了一些数据。有没有 捕获异常时停止线程的可能性
是的,如果跳转到外部捕捉块,线程将不再执行while循环。如果确实需要两个try-catch块,请将外部try-catch移动到while循环中
我知道这是因为我在客户端看到了一些数据。有没有 捕获异常时停止线程的可能性
是的,如果跳转到外部catch块,则循环时线程将不再执行。是否在异常处理程序中设置了断点?或者在线程开始的位置?可能在启动之前发生了一些事情。如果您的代码从未达到“If(ClientRequests.Count>0)”,则它从未进入此方法。您的问题可能在其他地方。我知道这是因为我在客户端看到了一些数据。如果捕获到异常,是否有可能停止线程?是否在异常处理程序中设置了断点?或者在线程开始的位置?可能在启动之前发生了一些事情。如果您的代码从未达到“If(ClientRequests.Count>0)”,则它从未进入此方法。您的问题可能在其他地方。我知道这是因为我在客户端看到了一些数据。如果捕获到异常,是否有可能停止线程?是的,没错。当我查看日志时,我看到在“TxDataLen=ActiveClientRequest.CommPacket.TCPClient.Client.Send(convertpacketorawdata(ActiveClientRequest.CommPacket.PacketStr));”行中有一个esoption caugth,所以这解释了我的线程停止工作的原因。谢谢。是的,没错。当我查看日志时,我看到在“TxDataLen=ActiveClientRequest.CommPacket.TCPClient.Client.Send(convertpacketorawdata(ActiveClientRequest.CommPacket.PacketStr));”行中有一个esoption caugth,所以这解释了我的线程停止工作的原因。非常感谢。