ZeroMQ CLRZMQ—轮询套接字

本文关键字:套接字 CLRZMQ ZeroMQ | 更新日期: 2023-09-27 18:01:18

我已经在Python中使用Pyzmq工作了一段时间,我必须将我们的一些代码移植到c#与CLRZMQ绑定。我一直在谷歌上寻找一些文档,但除了一些过时的代码示例之外,我什么也没找到,甚至不能工作,这非常令人沮丧。

我现在想要达到的是一件非常简单的事情。我们有一个简单的函数,它用超时轮询套接字,当超时时间过去时,它会引发一个自定义异常。下面是它在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文档,如果您能指出我在哪里可以找到它,我将不胜感激。

谢谢

ZeroMQ CLRZMQ—轮询套接字

好了,这是实际的最终答案。在这个例子中,我甚至不需要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();
    }
}

好的。我认为可能已经找到解决办法了。虽然我还没有测试过。

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

想法吗?

好的,我成功了。

下面是在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示例中得到启发,即使在那里,它们也没有真正解释什么是什么。