C# NetMQ.FiniteStateMachineException:Rep.XRecv-无法接收另一个请求
我经常收到C# NetMQ.FiniteStateMachineException:Rep.XRecv-无法接收另一个请求,c#,zeromq,netmq,C#,Zeromq,Netmq,我经常收到NetMQ.finiteTesteMachineException 当然,我的代码是有效的。。。异常不会立即发生。。。但在几个小时的过程中,它可能会发生 有人知道是什么导致了这个异常吗 我不太清楚为什么,尽管我读过这里的解释: 我得到了一堆这样的东西: 例外 我的代码 //线程开始代码 如果(线程==null){ print2(“加载项{0}:正在启动,侦听端口:{1}…”,GetType().Name,ZeroPort); 线程=新线程(ZeroMQ_服务器); thread.St
NetMQ.finiteTesteMachineException
当然,我的代码是有效的。。。异常不会立即发生。。。但在几个小时的过程中,它可能会发生
有人知道是什么导致了这个异常吗
我不太清楚为什么,尽管我读过这里的解释:
我得到了一堆这样的东西:
例外
我的代码
//线程开始代码
如果(线程==null){
print2(“加载项{0}:正在启动,侦听端口:{1}…”,GetType().Name,ZeroPort);
线程=新线程(ZeroMQ_服务器);
thread.Start();
}
//zeroMQ代码
#区域任务回调-NetMQ
//此线程过程执行该任务。
专用void ZeroMQ_服务器()
{
bool-quit=false;
string bindAddress=“tcp://*:”+ZeroPort;
试一试{
而(!退出){
试一试{
使用(var repSocket=newresponsesocket())
{
currenpsocket=repSocket;
print2(“{0}***上的***绑定”,bindAddress);
repSocket.Bind(bindAddress);
而(!退出){
试一试{
运行=真;
var msgStr=repSocket.ReceiveFrameString();
打印2(”[►] {2} [REP:{0}]{1},bindAddress,msgStr,DateTime.Now.ToString(“HH:mm:ss.fff”);
if(processMsg(msgStr)){
StringBuilder csv=新的StringBuilder();
//把建筑材料串在这里
字符串cs=csv.ToString();
打印2(”[◄] csv:{0}”,cs);
repSocket.SendFrame(cs);
}否则{
SendFrame(“无法识别的命令:+msgStr”);
打破
}
}捕获(例外e){
quit=IsThread中止(e);
}
}
}
}捕获(例外e){
如果(e是地址ReadyUseException){
//打印2(“”);
}else quit=IsThread中止(e);
}最后{
currenpsocket=null;
运行=错误;
}
}
}最后{
//NetMQConfig.Cleanup();
}
}
私有布尔ISThread已中止(异常e){
如果(e是ThreadAbortException){
print2(“\n***线程中止…***”);
返回true;
}否则{
打印2(e);
返回false;
}
}
响应套接字是一个状态机,您必须回复每个请求。
从代码来看,如果processMsg抛出,您似乎不会发送任何内容,因此您无法再次接收并获取异常
如果客户端不在,则发送失败也会导致此错误
尝试改用路由器,如下所示:
while (true)
{
bool more;
var msg = routerSocket.ReceiveFrameBytes(out more);
// Forwarding the routing id.
routerSocket.SendMoreFrame(msg);
// Bottom, next frame is the message
if (msg.Length == 0)
break;
}
// Write your handling here
如果
processMsg()
返回true
或false
则仍然调用repSocket.SendFrame()
,这就是我感到困惑的地方。我知道你看不到processMsg()
中的内容,但它有一个捕获(异常e)
将返回false
,因此无论哪种方式,它都将返回true
或false
,而不允许异常逃逸-您对我可以研究什么有其他想法吗?任何其他异常?我没有看到一个-但是我曾经获得AddressReadyUseException
但是我没有看到它ink我修正了这一点。作为一种临时解决方法,我可以将整个过程包装在一个catch块中,以防止我的程序停止并创建一个新的rep套接字吗?如果遇到此FiniteStateMachineException
,您将不得不重新创建响应套接字。实际上,如果消息无法发送(因为客户端已离开)它也将失败。
while (true)
{
bool more;
var msg = routerSocket.ReceiveFrameBytes(out more);
// Forwarding the routing id.
routerSocket.SendMoreFrame(msg);
// Bottom, next frame is the message
if (msg.Length == 0)
break;
}
// Write your handling here