我已经使用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文档,如果你能指出我能找到它的话,我将不胜感激。
由于
答案 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示例,即使在那里他们也没有真正解释什么做了什么。只是想弄清楚。