Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ZeroMQ Kill线程函数_C#_Multithreading_Zeromq - Fatal编程技术网

C# ZeroMQ Kill线程函数

C# ZeroMQ Kill线程函数,c#,multithreading,zeromq,C#,Multithreading,Zeromq,我正在使用ZeroMQ创建项目。我需要函数来启动和终止线程。启动功能似乎工作正常,但停止功能存在问题 private Thread _workerThread; private object _locker = new object(); private bool _stop = false; public void Start() { _workerThread = new Thread(RunZeroMqServer); _workerThread.

我正在使用ZeroMQ创建项目。我需要函数来启动和终止线程。启动功能似乎工作正常,但停止功能存在问题

private Thread _workerThread;
private object _locker = new object();
private bool _stop = false;

public void Start()
    {
        _workerThread = new Thread(RunZeroMqServer);
        _workerThread.Start();
    }

    public void Stop()
    {
        lock (_locker)
        {
            _stop = true;
        }

        _workerThread.Join();
        Console.WriteLine(_workerThread.ThreadState);
    }

    private void RunZeroMqServer()
    {
        using (var context = ZmqContext.Create())
        using (ZmqSocket server = context.CreateSocket(SocketType.REP))
        {
            /*
            var bindingAddress = new StringBuilder("tcp://");
            bindingAddress.Append(_ipAddress);
            bindingAddress.Append(":");
            bindingAddress.Append(_port);
            server.Bind(bindingAddress.ToString());
            */

            //server.Bind("tcp://192.168.0.102:50000");
            server.Bind("tcp://*:12345");

            while (!_stop)
            {
                string message = server.Receive(Encoding.Unicode);
                if (message == null) continue;

                var response = ProcessMessage(message);
                server.Send(response, Encoding.Unicode);

                Thread.Sleep(100);
            }
        }
    }
也许有人知道这个Stop()函数,为什么它不杀死线程? 我得到了应该使用Thread.MemoryBarrier和volatile的提示,但不知道它应该如何工作。
还有一个ProcessMessage()函数用于处理消息,我只是没有将其复制到“不要乱扔垃圾:)

问题似乎是您调用的是
ZmqSocket.Receive的阻止版本。当它等待接收消息时,它不会处理代码的其余部分,因此它永远不会达到循环条件

解决方案是使用一种非阻塞方法,或者使用一种具有超时的方法。试试这个:

string message = server.Receive(Encoding.Unicode, TimeSpan.FromMilliseconds(100));
如果没有收到消息,则应在100毫秒后返回,如果消息到达,则应在更早时间返回。无论哪种方式,它都会在循环条件下获得一次机会


至于
\u stop
标志本身

当您从多个线程访问变量时,锁定是一个好主意。然而,在一个简单标志的情况下,读和写几乎都是原子操作。在这种情况下,将其声明为volatile(
private volatile bool\u stop=false;
)就足够了,这样编译器就可以确保每次您告诉它时,它总是实际读取当前值