Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.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# 我如何知道队列何时结束,我的线程使用MQ消息_C#_.net_Multithreading_Ibm Mq - Fatal编程技术网

C# 我如何知道队列何时结束,我的线程使用MQ消息

C# 我如何知道队列何时结束,我的线程使用MQ消息,c#,.net,multithreading,ibm-mq,C#,.net,Multithreading,Ibm Mq,我需要使用MQ队列中的消息,然后在完成队列使用时关闭控制台应用程序。我不知道消息何时在队列中。我能够成功地进行读取,但是我不知道何时结束使用队列并使线程保持打开状态。我需要知道我怎样才能识别这个时刻 this.connection = cf.CreateConnection(); this.connection.ExceptionListener = new ExceptionListener(this.OnException); this.sessi

我需要使用MQ队列中的消息,然后在完成队列使用时关闭控制台应用程序。我不知道消息何时在队列中。我能够成功地进行读取,但是我不知道何时结束使用队列并使线程保持打开状态。我需要知道我怎样才能识别这个时刻

    this.connection = cf.CreateConnection();

        this.connection.ExceptionListener = new ExceptionListener(this.OnException);

        this.session = this.connection.CreateSession(true, AcknowledgeMode.AutoAcknowledge); // sessão com controle de transação

        IDestination destQueue = this.session.CreateQueue(filaMensagem);

        this.consumer = this.session.CreateConsumer(destQueue);

        // Create an AutoResetEvent for signalling between threads
        using (this.receiveCompleteEvent = new AutoResetEvent(false))
        {
            // Create and register the listener
            this.consumer.MessageListener = new MessageListener(this.OnNewMessageCallback); // Callback for message handling

            // Start the connection
            this.connection.Start();

            // Block and wait for the receiveCompleteEvent event to be signalled.
            this.receiveCompleteEvent.WaitOne();
        }

        // dispose receiveCompleteEvent
        this.consumer.Close();

        this.session.Close();

        this.connection.Close();

“使用队列”并不是消息队列的正确使用场景。消息可以在任何时候到达,非常不可预测,您通常喜欢快速响应它们。因此,你会考虑永远离开这个项目。请注意,AutoResetEvent似乎设计为在只收到一条消息时退出,您肯定不希望这样。最简单的方法是使用Console.ReadLine()代替谚语中的“按Enter键继续”。在我的上下文中,这将发生在后台。我们将不会有任何用户交互。我将有一个例程,每天运行应用程序几次,并在那一刻使用队列,因此我们将使用MQ来管理消息队列。当然,没有人会喜欢等待它。在服务中执行此操作通常是正确的方法,会一直运行,直到计算机管理员认为由于某种维护操作而停止此操作是个好主意。不要使用异步消息侦听器,直接使用同步使用者即可。队列为空时,队列管理器将返回2033原因码。最佳实践通常是在这之后等待一段时间,以防在结束之前出现更多消息。其他最佳实践是,当消息显示在队列上时,让应用程序触发器再次开始读取消息。“使用队列”并不是消息队列的正确使用场景。消息可以在任何时候到达,非常不可预测,您通常喜欢快速响应它们。因此,你会考虑永远离开这个项目。请注意,AutoResetEvent似乎设计为在只收到一条消息时退出,您肯定不希望这样。最简单的方法是使用Console.ReadLine()代替谚语中的“按Enter键继续”。在我的上下文中,这将发生在后台。我们将不会有任何用户交互。我将有一个例程,每天运行应用程序几次,并在那一刻使用队列,因此我们将使用MQ来管理消息队列。当然,没有人会喜欢等待它。在服务中执行此操作通常是正确的方法,会一直运行,直到计算机管理员认为由于某种维护操作而停止此操作是个好主意。不要使用异步消息侦听器,直接使用同步使用者即可。队列为空时,队列管理器将返回2033原因码。最佳实践通常是在这之后等待一段时间,以防在结束之前出现更多消息。其他最佳实践是,当消息显示在队列上时,让应用程序触发器再次开始读取消息。