1. ホーム
  2. c#

[解決済み】スレッド終了またはアプリケーションの要求により、I/O操作が中断されました。

2022-01-26 15:29:25

質問

私のアプリケーションは、銀行サーバーのクライアントアプリケーションとして動作しています。このアプリケーションは、リクエストを送信し、銀行からレスポンスを取得しています。このアプリケーションは通常問題なく動作していますが、時々

I/O操作は、スレッド終了または アプリケーションの要求

エラーコードが995のエラーが出る。

public void OnDataReceived(IAsyncResult asyn)
{
    BLCommonFunctions.WriteLogger(0, "In :- OnDataReceived", 
                                        ref swReceivedLogWriter, strLogPath, 0);
    try
    {
        SocketPacket theSockId = (SocketPacket)asyn.AsyncState;

        int iRx = theSockId.thisSocket.EndReceive(asyn); //Here error is coming
        string strHEX = BLCommonFunctions.ByteArrToHex(theSockId.dataBuffer);                    

    }
}

一度このエラーが出始めると、それ以降のすべてのトランザクションで同じエラーが出始めるので。 この問題を解決するために、どうか助けてください。可能であれば、いくつかのサンプルコードで

よろしくお願いします。 アシシュ・カンデルワル

解決方法は?

995 は IO完了ポート . このエラーは、ソケットがクローズされているにもかかわらず、読み込みを継続しようとしたために発生します。

からの受信は0バイト EndRecieve は、ソケットが閉じられたことを意味します。 EndRecieve が投げられます。

そういう場面から対処していく必要があります。

例外を決して無視してはいけません。例外が投げられるのには理由があるのです。

更新情報

サーバーが悪いということはないのですが。接続は、スイッチ/ルーター/ファイアウォールによってアイドル接続が閉じられたり、ネットワークの揺れ、ケーブルの不良など、さまざまな理由で失われる可能性があります。

私が言いたいのは、切断された場合は必ず処理しなければならないということです。適切な方法は、ソケットを破棄して、一定の間隔で新しいソケットの接続を試みることです。

受信コールバックについては、より適切な処理方法として、次のようなものがあります(半仮想コード)。

public void OnDataReceived(IAsyncResult asyn)
{
    BLCommonFunctions.WriteLogger(0, "In :- OnDataReceived", ref swReceivedLogWriter, strLogPath, 0);

    try
    {
        SocketPacket client = (SocketPacket)asyn.AsyncState;

        int bytesReceived = client.thisSocket.EndReceive(asyn); //Here error is coming
        if (bytesReceived == 0)
        {
          HandleDisconnect(client);
          return;
        }
    }
    catch (Exception err)
    {
       HandleDisconnect(client);
    }

    try
    {
        string strHEX = BLCommonFunctions.ByteArrToHex(theSockId.dataBuffer);                    

        //do your handling here
    }
    catch (Exception err)
    {
        // Your logic threw an exception. handle it accordinhly
    }

    try
    {
       client.thisSocket.BeginRecieve(.. all parameters ..);
    }
    catch (Exception err)
    {
       HandleDisconnect(client);
    }
}

なぜ3つのキャッチブロックを使っているかというと、単純に真ん中のキャッチブロックのロジックが他の2つと違うからです。BeginReceive/EndReceiveの例外は通常ソケットの切断を示しますが、あなたのロジックからの例外はソケットの受信を停止させるべきではありません。