【问题标题】:Microsoft Messaging Queue ReceiveCompleted EventMicrosoft 消息队列 ReceiveCompleted 事件
【发布时间】:2015-07-20 06:09:28
【问题描述】:

我有一个控制台应用程序。在这个应用程序中,我与队列联系。首先,我检查例如名称为“exampleQueue”的队列是否存在。如果它不存在,我创建它。 在创建和返回路径或只是返回路径之后。我想将 ReceiveCompleted 事件附加到此队列。 我有两种方法,我可以使用“使用”关键字在工作后处理队列,或者我可以使用普通方式创建队列对象。

在下面你可以看到我的代码:

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            CreateQueue(".\\exampleQueue", false);
            using (var queue = new MessageQueue(".\\exampleQueue"))
            {
                queue.ReceiveCompleted += MyReceiveCompleted;
                queue.BeginReceive();
            }
        }
        public static void CreateQueue(string queuePath, bool transactional)
        {
            if (!MessageQueue.Exists(queuePath))
            {
                MessageQueue.Create(queuePath, transactional);
            }
            else
            {
                Console.WriteLine(queuePath + " already exists.");
            }
        }
        private static void MyReceiveCompleted(Object source,
            ReceiveCompletedEventArgs asyncResult)
        {
            var queue = (MessageQueue)source;
            try
            {
                var msg = queue.EndReceive(asyncResult.AsyncResult);
                Console.WriteLine("Message body: {0}", (string)msg.Body);
                queue.BeginReceive();
            }
            catch (Exception ex)
            {
                var s = ex;
            }
            finally
            {
                queue.BeginReceive();
            }
            return;
        }
    }
}

我面临的问题是,每当我使用此代码创建队列对象时

using (var queue = new MessageQueue(".\\exampleQueue"))
            {
                queue.ReceiveCompleted += MyReceiveCompleted;
                queue.BeginReceive();
            }

MyReceiveCompleted 事件无法正常工作。 但是当我使用这个时

var queue = new MessageQueue(".\\exampleQueue");
            queue.ReceiveCompleted += MyReceiveCompleted;
            queue.BeginReceive();

一切都以正确的方式工作。

我的问题是哪种方法最好? 如果我选择使用第一个方法,我怎样才能让它工作?

请接受我对打字错误的道歉。

【问题讨论】:

  • 您的队列对象将被垃圾收集器清理。 using 语句导致立即调用 dispose。将您的队列变量更改为程序类的静态变量。基本上队列在你的事件可以触发之前被清理。
  • tnx 为您解答。我想知道我是否没有处置我的物品。在生产使用中会出现问题吗?我的意思是说在 1 周或 1 个月之后,该对象不会影响性能?
  • 是的,垃圾收集器仍会在未来某个未确定的时间点丢弃您的队列对象,并且您的 ReceiveCompleted 事件不会触发。

标签: c# message msmq queuing


【解决方案1】:

您可以使用原始方法,但必须确保 Main 方法在 using 语句内阻塞:

static void Main(string[] args)
{
    CreateQueue(".\\exampleQueue", false);

    using (var queue = new MessageQueue(".\\exampleQueue"))
    {
        queue.ReceiveCompleted += MyReceiveCompleted;
        queue.BeginReceive();

        // here you have to insert code to block the 
        // execution of the Main method.
        // Something like:
        while(Console.ReadLine() != "exit")
        {
            // do nothing
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-18
    • 2014-05-07
    • 2017-02-12
    • 1970-01-01
    • 2011-05-14
    • 2011-08-19
    • 2010-10-15
    相关资源
    最近更新 更多