繁体   English   中英

在ZeroMQ C#中断开套接字

[英]Disconnecting Socket in ZeroMQ C#

我正在使用ZeroMQ的NuGet包用于Visual Studio。 我使用的版本是3.0.0-rc1。

我一直在寻找相当长的一段时间,仍然无法找到一个“优雅”的解决方案来解决我的问题。 我正在创建一个服务器(ROUTER)套接字,然后基本上等待任何数据到达该套接字。 我这样做是通过创建一个轮询器并在无限循环中等待。 我的问题是试图弄清楚当我试图关闭应用程序时如何摆脱对Poll()的调用。 顺便说一句,下面的代码是在一个单独的线程中完成的,我将我的上下文传递给线程以创建Socket。

        using (ZmqSocket server = cntxt.CreateSocket(ZeroMQ.SocketType.ROUTER))
        {
            string strSocketAddress = String.Format("tcp://{0}:{1}", strIPAddress, nPort.ToString());

            try
            {
                server.Linger = TimeSpan.FromMilliseconds(1); ;

                server.Bind(strSocketAddress);

                server.ReceiveReady += server_ReceiveReady;

                ZeroMQ.Poller poller = new Poller(new List<ZmqSocket> {server});

                while (true)
                {
                    poller.Poll();
                }

            }
            catch (ZmqException zex)
            {
                server.Disconnect(strSocketAddress);

                server.Close();

                server.Dispose();
            }
        }

这里的一切都按预期工作,每当我在套接字上收到数据时,我都会收到事件。 但是当我想要关闭应用程序时,我无法弄清楚我是如何打破循环的。 我确实理解我可以对投票进行超时,并设置某种标志来表示我正在关闭,但我希望有一个“更好”的解决方案。

现在发生的是当我想要关闭时,我在上下文中调用Terminate,但此时应用程序挂起并且永远不会返回。 我假设它挂了,因为我仍然打开一个插座。 我还读到了这一点,通过将Linger标志设置为一个非常小的东西,套接字应该在上下文中调用Terminate之后关闭但是没有发生。

我有catch子句的原因是因为当我使用版本2.0并且我在上下文中调用Dispose()时,我会收到一个异常,我可以优雅地摆脱套接字,但我不再得到异常3.0版。

所以我想知道我是否只是错过了什么? 如果有一个更“优雅”的方法来关闭一个套接字,它在自己的线程中等待消息?

不是真的“优雅”,但是老而简单的方法是从同一个进程(不同的线程)实际连接到你的侦听套接字,所以你得到“事件”并在那一点检查“shutdown”标志。

这个hack的原始名称是“自管技巧”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM