0

我有一个多线程应用程序 ( 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),程序不会停止,断点也不会被命中。当我暂停调试并查看线程窗口时,没有看到线程。

你认为问题出在哪里?我认为,线程随时停止运行。

4

1 回答 1

4

如果您确实需要两个 try-catch 块,请将外部 try-catch 移动到 while 循环内。

我知道它开始了,因为我在客户端看到了一些数据。如果捕获到异常,是否有可能停止线程?

是的,如果它跳转到外部 catch 块线程将不再执行 while 循环。

于 2012-05-15T07:21:33.337 回答