由于线程退出或应用程序请求,I/O操作已中止

fun*_*gdu 14 c# sockets exception

我的应用程序作为银行服务器的客户端应用程序.应用程序正在发送请求并从银行获得响应.这个应用程序通常工作正常,但有时

由于线程退出或应用程序请求,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);                    

    }
}
Run Code Online (Sandbox Code Playgroud)

在相同的错误开始出现后,所有事务开始出现此错误,请帮助我解决此问题.如果可能,那么使用一些示例代码

此致,Ashish Khandelwal

jga*_*fin 14

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我使用三个catch块的原因仅仅是因为中间逻辑的逻辑与其他两个不同.BeginReceive/EndReceive的异常通常表示套接字断开,而逻辑中的异常不应该停止套接字接收.


小智 14

就我而言,请求已超时。因此,您需要做的就是在创建 HttpClient 时增加超时时间。

HttpClient client = new HttpClient();
client.Timeout = TimeSpan.FromMinutes(5);
Run Code Online (Sandbox Code Playgroud)

  • 问题中没有提到 HttpClient 吗? (3认同)

小智 6

我在RS232通讯中遇到了同样的问题。原因是您的程序执行速度比命令(或慢速串行通信)快得多。

要解决此问题,我必须检查IAsyncResult.IsCompleted==true。如果没有完成,那么IAsyncResult.AsyncWaitHandle.WaitOne()

像这样 :

Stream s = this.GetStream();
IAsyncResult ar = s.BeginWrite(data, 0, data.Length, SendAsync, state);
if (!ar.IsCompleted)
    ar.AsyncWaitHandle.WaitOne();
Run Code Online (Sandbox Code Playgroud)

大多数时候,ar.IsCompleted它将是true