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

本当に 2 つの try-catch ブロックが必要な場合は、外側の try-catch を while ループ内に移動します。

クライアント側でいくつかのデータを見たので、それが始まったことを知っています。例外がキャッチされた場合、スレッドを停止する可能性はありますか?

はい、外側の catch ブロック スレッドにジャンプすると、while ループは実行されなくなります。

于 2012-05-15T07:21:33.337 に答える