Friday, November 9, 2012

Windows Message Queue (MSMQ) with Threading using C#.NET

In last post we learned how to create a simple message queue. In this article we are going to write a C# app to use the message queue in thread, so that one thread can be used to send messages and other to read it.


1) Create a console application in C#

2) Declare class level variable

   static bool StopThread = false;

2) Write function to get message queue instance


private static MessageQueue GetStringMessageQueue()
        {
            MessageQueue msgQueue = null;
            string queueName = @".\private$\MyStringQueue";
            if (!MessageQueue.Exists(queueName))
            {
                msgQueue = MessageQueue.Create(queueName);
            }
            else
            {
                msgQueue = new MessageQueue(queueName);
            }
            return msgQueue;
        }

3)  Create function to send message to queue


  private static void SendStringMessageToQueue()
        {
            while (StopThread == false)
            {
                string msg = Console.ReadLine();
                if (msg == "x")
                {
                    Console.WriteLine("Stopping write thread...");
                    StopThread = true;
                    break;
                }
                else
                {
                    MessageQueue msgQueue = GetStringMessageQueue();
                    msgQueue.Send("New Message send to message queue at " + DateTime.Now.ToString() + "- " + msg);
                }
            }
        }


4) Create function to read message


    private static void ReadStringMessageFromQueue()
        {
            MessageQueue msgQueue = GetStringMessageQueue();
            msgQueue.Formatter = new XmlMessageFormatter(new string[] { "System.String" });

            Message msg;
            while (StopThread == false)
            {            
                if (StopThread == true)
                {
                    Console.WriteLine("Stopping read thread...");
                    break;
                }
                try
                {
                    msg = msgQueue.Receive(new TimeSpan(0, 0, 2));
                    Console.WriteLine(msg.Body.ToString());
                }
                catch (Exception ex)
                {
                }
            }
        }

5) Now create threads within static main method


  static void Main(string[] args)
        {
            Console.WriteLine("Press x to stop thread");

            Thread sendMsgThread =  new Thread(new ThreadStart(SendStringMessageToQueue));
            Thread readMsgThread = new  Thread(new ThreadStart(ReadStringMessageFromQueue));

            sendMsgThread.Start();
            readMsgThread.Start();
         
        }

Thursday, November 8, 2012

Windows Message Queue (MSMQ) Using C#.Net

This article is about creating windows message queue using C#.NET.


In this article we will create a private queue example. Lets develop an app and understand how the private queue works


 1) Create a console application using Visual Studio

 2) In Program.cs create a static method to create/get a private queue. Don't forget to include the "System.Messaging" namespace

private static MessageQueue GetStringMessageQueue()
 {
 MessageQueue msgQueue = null;
 string queueName = @".\private$\MyStringQueue";
 if (!MessageQueue.Exists(queueName))
 {
 msgQueue = MessageQueue.Create(queueName );
 }
 else
 {
 msgQueue = new MessageQueue(queueName );
 }
 return msgQueue;
 }

3) So now we have the queue, lets send a message as given below

private static void SendStringMessageToQueue()
 {
 MessageQueue msgQueue = GetStringMessageQueue();
 msgQueue.Send("New Message send to message queue at "+ DateTime.Now.ToString());
 }

4) Given below is the function to read the message from queue

private static void ReadStringMessageFromQueue()
 {
 MessageQueue msgQueue = GetStringMessageQueue();
 msgQueue.Formatter = new XmlMessageFormatter(new string[] { "System.String" });
 Message msg = msgQueue.Receive(); Console.WriteLine(msg.Body.ToString());
 }

5) That's it! Now lets call the functions from 'static main'

static void Main(string[] args)
 {
 SendStringMessageToQueue();
 ReadStringMessageFromQueue();
 Console.ReadLine();
 }


Wasn't that easy! Well this is the basic queue...to make it more useful you have to send the message from one thread and read from another thread or application.

 Happy coding guys!