shuai's profile娱乐精神PhotosBlog Tools Help

Blog


    1/16/2007

    让MessageQueue.BeginReceive()阻塞

     
    让MessageQueue.BeginReceive()阻塞
    我发现MessageQueue.BeginReceive()跟本不会阻塞
    虽然文档上是这样写:
    启动一个没有超时设定的异步接收操作。直到队列中出现消息时,才完成此操作。
    但是事实证明不起作用
    并且希望做到事件式触发
    以及接收消息完一个后接收消息下一个
    于是我使用了ManualResetEvent:
    代码:
        public class Program
        {
            private static ManualResetEvent signal = new ManualResetEvent(false);       
            public static void Main()
            {
                ReceiveMessage();
            }
            public static void ReceiveMessage()
            {
                try
                {
                    MessageQueue messageQueue = new MessageQueue(".\\Private$\\StaticPageQueue");
                    messageQueue.Formatter = new BinaryMessageFormatter();
                    messageQueue.ReceiveCompleted += new ReceiveCompletedEventHandler(ReceiveCompleted);
                    while (true)
                    {
                        Console.WriteLine("Receiving...");
                        messageQueue.BeginReceive();
                        signal.Reset();            //允许线程阻止
                        signal.WaitOne();        //阻止当前线程。直到收到信号
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                }
            }
            private static void ReceiveCompleted(Object sender, ReceiveCompletedEventArgs asyncResult)
            {
                try
                {
                    MessageQueue messageQueue = (MessageQueue)sender;
                    Message message = messageQueue.EndReceive(asyncResult.AsyncResult);
                    StaticPageMessage spMessage = (StaticPageMessage)message.Body;
                       
                    Console.WriteLine(spMessage.StaticPageType);
                    signal.Set();        //允许阻塞线程继续
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                }
            }
        }