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文档,如果您能指出我在哪里可以找到它,我将不胜感激。
谢谢
好了,这是实际的最终答案。在这个例子中,我甚至不需要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示例中得到启发,即使在那里,它们也没有真正解释什么是什么。