gpt4 book ai didi

c# - ZeroMQ 上下文破坏导致轮询器进入 ETERM 但不会继续

转载 作者:行者123 更新时间:2023-12-02 22:30:40 24 4
gpt4 key购买 nike

我有一个非常简单的线程循环

public void ClientLoop(object AContext)
{
var context = (ZMQ.Context) AContext;

Socket client = CreateServerSocket(context);

while (true)
{
try
{
Context.Poller(requestTimeout*1000, client);
}
catch (Exception e)
{
if (e.Errno == ETERM)
{
//Catch a termination error.
Debug.WriteLine("Terminated! 1");
return;
}
}
}
}

还有一个看起来像下面这样的处置

public void Dispose()
{
_context.Dispose();
}

创建客户端套接字时,将 linger 设置为零,并在处理程序集中设置轮询器。该套接字也是一个请求套接字。

一旦 dispose 被调用,poller excepts 就会落入 try except block 。然而,在处置之后并没有像我想象的那样继续。这就是 ZGuide 所说的处理上下文和套接字销毁的方式,但是在这种情况下它似乎不起作用。

我错过了什么?

最佳答案

However after the dispose doesn't continue like I thought it would.

您的意思是 Dispose 调用挂起/阻塞?那是因为您在从线程返回之前没有关闭客户端套接字。 (我下面的语法可能是错误的,但你明白了)

        if (e.Errno == ETERM)
{
//Catch a termination error.
Debug.WriteLine("Terminated! 1");
client.Close();
return;
}

将 linger 设置为 0 是不够的 - 这只是防止套接字关闭阻塞。您仍然必须关闭工作线程中的套接字以防止 _context.Dispose() 阻塞。

This is how the ZGuide says to handle destruction of the context and sockets...

嗯 - 这是真的,但文档中有一个重要的限定词:

We'll get to multithreading in the next chapter, but because some of you will, despite warnings, will try to run before you can safely walk, below is the quick and dirty guide to making a clean exit in a multithreaded ØMQ application.

在文档的后面,他们描述了如何通过在每个线程中有一个专用套接字来监听终止信号来进行干净关闭。考虑通过做类似的事情来增强您的工作线程。通过这种方式,您可以通过向每个线程发送一条消息来请求每个线程自行关闭 - 然后每个线程退出其运行循环,彻底关闭其套接字并退出。一旦所有线程都退出,您就可以安全地处理上下文而不会出现任何错误。

关于c# - ZeroMQ 上下文破坏导致轮询器进入 ETERM 但不会继续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12318819/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com