由于线程退出或应用程序请求,I / O操作已中止
我的应用程序作为银行服务器的客户端应用程序。 应用程序正在发送请求并从银行获得响应。 这个应用程序通常工作正常,但有时
由于线程退出或应用程序请求,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); } }
在相同的错误开始出现后,所有事务开始出现此错误,请帮助我解决此问题。 如果可能,那么使用一些示例代码
此致,Ashish Khandelwal
995是IO完成端口报告的错误。 自从您尝试在最可能已关闭时继续从套接字读取错误时出现错误。
从EndRecieve
接收0个字节意味着套接字已关闭, EndRecieve
将抛出的大多数exception也是如此。
你需要开始处理这些情况。
永远不要忽视exception,它们被抛出是有原因的。
更新
没有任何东西说服务器做错了什么。 连接可能由于很多原因而丢失,例如交换机/路由器/防火墙关闭空闲连接,网络不稳定,电缆不良等。
我所说的是你必须处理断线。 这样做的正确方法是配置sockets并尝试以一定间隔连接新sockets。
至于接收回调,更合适的处理方式是这样的(半伪代码):
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); } }
我使用三个catch块的原因仅仅是因为中间逻辑的逻辑与其他两个不同。 BeginReceive / EndReceive的exception通常表示套接字断开,而逻辑中的exception不应该停止套接字接收。
我遇到了与RS232通信相同的问题。 原因是,您的程序执行速度比comport(或慢速串行通信)快得多。
要修复它,我必须检查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();
大多数时候, ar.IsCompleted
将是true
。
我发生的事情是将COM端口禁用到设备管理器中并再次启用它。
它停止与其他程序或线程的通信,并为您免费。
我希望这适合你。 问候。
我有这个问题。 我认为它是由套接字打开引起的,没有数据在打开后的短时间内到达。 我正在从一个名为Devicemaster的串口到以太网盒中读取。 我将Devicemaster端口设置从“始终连接”更改为“连接数据”,问题消失了。 我非常尊重Hans Passant,但我不同意这是一个错误代码,您可以通过仔细检查代码轻松解决。