ZeroMQ CLRZMQ - 轮询套接字

时间:2014-05-01 21:56:12

标签: c# python .net zeromq

我已经使用Pyzmq在Python中使用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之间调用此函数,这样如果我们在收听数据时遇到超时,我们就可以管理它。

如何使用CLRZMQ在C#中实现类似的功能?

另外,如果CLRZMQ有任何类型的api文档,如果你能指出我能找到它的话,我将不胜感激。

由于

3 个答案:

答案 0 :(得分:2)

好的,这是实际的最终答案。在这一个中,我甚至不需要Context的实例。这样做要好得多。

这是在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();
    }
}

答案 1 :(得分:0)

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

为了实现与我在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();
    }
}

思想?

答案 2 :(得分:0)

好的,我设法让它发挥作用。

这是在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示例,即使在那里他们也没有真正解释什么做了什么。只是想弄清楚。