【问题标题】:ZeroMQ CLRZMQ - Polling a socketZeroMQ CLRZMQ - 轮询套接字
【发布时间】:2014-07-03 23:24:35
【问题描述】:

我在 Python 中使用 Pyzmq 使用 ZMQ 已经有一段时间了,我必须使用 CLRZMQ 绑定将我们的一些代码移植到 C#。我一直在谷歌四处寻找某种文档,但除了一些甚至无法正常工作的过时代码示例外,我几乎一无所获。

我现在想要实现的目标非常简单。我们有一个简单的函数来轮询一个超时的套接字,当超时时间过去时,它会引发一个自定义异常。这是它在 Python 中的样子:

def raise_on_timeout(sock, timeout):
    """
    sock is a ZMQ socket
    timeout is a timedelta object from datetime.
    """
    if timeout is not None:
        timeout = int(timeout.total_seconds() * 1000)
        if not sock.poll(timeout):
            raise TimeoutException("Communication timed out")

看起来很简单,对吧?该函数在 send_multipart 和 recv_multipart 之间调用,因此如果我们在监听数据时遇到超时,我们可以进行管理。

如何在 C# 中使用 CLRZMQ 实现类似的东西?

另外,如果有任何类型的用于 CLRZMQ 的 api 文档,如果您能指出我在哪里可以找到它,我将不胜感激。

谢谢

【问题讨论】:

  • 出于好奇。这是什么语言?我假设是 python,但没有看到任何标签。 zeromq.com 网站有一些看起来更像 C 的例子......
  • @ebyrob 是的,在这种情况下是 Python。我最初在 Python 中使用 ZMQ,但不得不在 C# 中重现一些代码。

标签: c# python .net zeromq


【解决方案1】:

好的,这是实际的最终答案。在这个中,我什至不需要上下文的实例。这样会好很多。

这是在 C# 中创建类似 raise_on_timeout 方法的代码。

public static void RaiseOnTimeout(Socket sock, TimeSpan timeout)
{
    List<PollItem> pollItemsList = new List<PollItem>();
    PollItem pollItem = sock.CreatePollItem(IOMultiPlex.POLLIN);
    pollItemsList.Add(pollItem);

    int numReplies = Context.Poller(pollItemsList.ToArray(), timeout.Value.Ticks * 10);

    if (numReplies == 0)
    {
        throw new TimeoutException();
    }
}

【讨论】:

    【解决方案2】:

    好的。我认为可能找到了解决方案。虽然我还没有测试过。

    为了实现与我想在 Python 中做的相同的事情,这个应该以同样的方式来做。

    private static void RaiseOnTimeout(Socket sock, long timeoutMicroSeconds)
    {
        List<socket> sockList = new List<Socket>() {sock};
        int numEvents = Context.Poller(sockList), timeoutMicroSeconds);
    
        if (numEvents == 0)
        {
            throw new TimeoutException();
        }
    }
    

    想法?

    【讨论】:

      【解决方案3】:

      好的,我成功了。

      这是在 C# 中创建类似 raise_on_timeout 方法的代码。

      public static void RaiseOnTimeout(Context ctx, Socket sock, TimeSpan timeout)
      {
          List<PollItem> pollItemsList = new List<PollItem>();
          PollItem pollItem = sock.CreatePollItem(IOMultiPlex.POLLIN);
          pollItemsList.Add(pollItem);
      
          int numReplies = ctx.Poll(pollItemsList.ToArray(), timeout.Value.Ticks * 10);
      
          if (numReplies == 0)
          {
              throw new TimeoutException();
          }
      }
      

      做到了。但并不明显,因为 C# 的文档很少。我只是从指南中的 Java 示例中启发了自己,即使在那里他们也没有真正解释什么是做什么的。只好想办法了。

      【讨论】:

        猜你喜欢
        • 2018-09-20
        • 1970-01-01
        • 1970-01-01
        • 2011-11-18
        • 1970-01-01
        • 1970-01-01
        • 2010-10-31
        • 1970-01-01
        • 2017-02-18
        相关资源
        最近更新 更多