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