ZContext

时间:2018-01-17 09:26:47

标签: c# winforms zeromq

我很难看到Zeromq C# API中有以下3种类似的方法。

  1. 处置
  2. 终止
  3. 关闭
  4. 以上3种方法的名称相似。但是我不确定它们的正确含义。

    基本上,在提供的示例中,例如Weather update server,由于关键字using,配置功能由C#自动完成。但是,在我的代码中,我想手动处理ZContext对象。请参阅下面的代码段:

    public partial class DataPublisherForm : Form
    {
        private ZContext zmqContext;
        private ZSocket sensorDataPublisher;
    
        public DataPublisherForm()
        {
            mySensor = new Sensor();
            mySensor.DataArrived += OnDataArrived;
            zmqContext = new ZContext();
            sensorDataPublisher = new ZSocket(zmqContext, ZSocketType.PUB);
            sensorDataPublisher.SetOption(ZSocketOption.CONFLATE, 1);
            sensorDataPublisher.Bind("tcp://*:10000");
        }
    
        private void OnDataArrived(object sender, DataArrivedEventArgs e)
        {
            byte[] sensorData = e.getSenorData();
            sensorDataPublisher.Send(new ZFrame(sensorData));
        }
    
        private void DataPublisherForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            zmqContext.Shutdown();
            if (sensorDataPublisher != null)
            {
                sensorDataPublisher.Close();
                sensorDataPublisher.Dispose();
            }
        }
    }
    

    以下是我的观察:

    1. Dispose:当我使用Dispose方法时,应用程序挂起(没有响应)
    2. Shutdown:当我使用Shutdown方法时,应用程序会顺利关闭。
    3. 以下是我的疑问:

      1. 处理ZContextZSocket个对象的正确方法是什么?
      2. DisposeTerminateShutdown方法有何区别?

1 个答案:

答案 0 :(得分:1)

简短版本:

嗯,在ZeroMQ zmqContext()实例的引擎下有一些魔法可能会让事情变得更加严重。

.Terminate()方法是强制性的API调用 .Shutdown()方法包含一个可选的API调用,必须调用强制API调用
.Dispose()方法首先执行GC.SuppressFinalize(this);并调用.Terminate()

最佳做法:

善待资源。更好地管理它们,并给予应有的注意 关闭事情要小心,这是有效的。不能正确处理整个马戏团。

public partial class DataPublisherForm : Form
{
    private ZContext zmqContext;                 // a Context() class-instance
    private ZSocket sensorDataPublisher;         // a Socket()  class-instance
 // -------------------------------------------- // this.VERSION details
    private int     majorVerNUM,
                    minorVerNUM,
                    patchVerNUM;

    private string libzmqVerSTR;
 // -------------------------------------------- //
    public DataPublisherForm()                   // CONSTRUCTOR:
    {
        zmqContext = new ZContext();
        zmq.zmq_version( this.majorVerNUM,       // Ref. a trailer note:
                         this.minorVerNUM,
                         this.patchVerNUM
                         );
        this.libzmqVerSTR = string.Format( "libzmq DLL is version {0}",
                                            zmq.LibraryVersion()
                                            );

        mySensor = new Sensor();
        mySensor.DataArrived += OnDataArrived;

        sensorDataPublisher = new ZSocket(zmqContext, ZSocketType.PUB);
        sensorDataPublisher.SetOption(ZSocketOption.CONFLATE, 1);
        sensorDataPublisher.Bind("tcp://*:10000");
    }

    private void OnDataArrived(object sender, DataArrivedEventArgs e)
    {
        byte[] sensorData = e.getSenorData();
        sensorDataPublisher.Send(new ZFrame(sensorData));
    }

    private void DataPublisherForm_FormClosing(object sender, FormClosingEventArgs e)
    {
        if (sensorDataPublisher != null)
        {   sensorDataPublisher.SetOption( ZSocketOption.LINGER, 0 );
            sensorDataPublisher.Close();
            sensorDataPublisher.Dispose();
        }
     // -------------------------<NEVER BEFORE SAFE DISMANTLING ALL SOCKETS>---
        zmqContext.Shutdown();                   // optional  API-call
        zmqContext.Terminate();                  // mandatory API-call
    }
 // -------------------------------------------- // VERSION CONTROL METHODS
    public  string  getDllVersionSTRING()        // a DLL version
    {   return this.libzmqVerSTR;
    }

    public  int getVersionMAJOR()                // a version() responder
    {   
        return this.majorVerNUM;
    }

    public  int getVersionMINOR()                // a version() responder
    {   
        return this.minorVerNUM;
    }

    public  int getVersionPATCH()                // a version() responder
    {   
        return this.patchVerNUM;
    }

}

原则上简单描述了一些版本控制方法,未详细说明,测试较少。使用类似概念的基本原理是,人们无法确保(实施)一个现实的分布式生态系统,只能授予同类API版本。

因此,在许多操作案例中,API版本无需匹配,ZeroMQ(除了自己的版本演变)还有不同的行为要求(性能方面,内存方面,{本地|非本地} - 处理方式)并且具有本地检测实际使用/链接的API版本或DLL版本的方法,值得拥有它们(调试报告是案例#1,更不用说其他,即时采取的API特定决策)

要求课程方法回答这些实际版本细节的能力可以在狩猎过程中或在新版本发布后对所有相关的工程变更和跟踪进行审查后,真正节省麻烦。所有新功能/改变的运作方式引入的新决策点。