private static Action ServiceActionMake(HiResTimer hres, WriterClient clnt, Receiver rcvr)
 {
     Action serviceAction = () =>
     {
         Message msg1 = null;
         while (true)
         {
             msg1 = rcvr.getMessage();   // note use of non-service method to deQ messages                           
             if (msg1.content == "done")
             {
                 hres.Stop(); ulong lookUpTime = hres.ElapsedMicroseconds;
                 Message msg2 = new Message();
                 msg2.fromUrl = clnt.localUrl;
                 msg2.toUrl = clnt.wpfClientURL;
                 msg2.content = "LookupTime;" + lookUpTime + ";" + "CntMsg;" + (ulong)clnt.total + ";";
                 Sender wpfSender = new Sender(clnt.localUrl);
                 wpfSender.sendMessage(msg2);
                 Console.WriteLine("\n----------------------Overall Performance Statistics for Write Client-----------------------------\n");
                 Console.WriteLine("Number of messages processed is {0}", clnt.total);
                 Console.WriteLine("\nTotal Execution time for the messages to be processed at Client Side is {0} microsecs", clnt.WriteClientTime);
                 Console.WriteLine("\nAverage Execution time for the messages to be processed at Client Side is {0} microsecs", clnt.WriteClientTime / (ulong)clnt.total);
                 Console.WriteLine("\nTotal Execution time for the messages from Client-Server-Client {0} microsecs", lookUpTime);
                 Console.WriteLine("\nAverage Execution time for the messages from Client-Server-Client is {0} microsecs", lookUpTime / (ulong)clnt.total);
                 Console.WriteLine("\n----------------------Overall Performance Statistics for Write Client-----------------------------\n");
                 break;
             }
             else if (msg1.content == "connection start message")
                 Console.WriteLine("Connection start message receieved at client side");
             else
             {
                 XDocument docTemp = XDocument.Load(new StringReader(msg1.content));
                 string mid = docTemp.Descendants("OperationMessage").Elements("MessageID").Single().Value;
                 string op = docTemp.Descendants("OperationMessage").Elements("Operation").Single().Value;
                 string resp = docTemp.Descendants("OperationMessage").Elements("Response").Single().Value;
                 Console.Write("\nMessage - MessageID:{0} received at the client", mid);
                 Console.Write("\nSender:{0}", msg1.fromUrl); Console.Write("\nOperation :{0}", op);
                 Console.Write("\nResponse :{0}", resp);
                 string oldDt = docTemp.Descendants("InsertTime").Select(i => i).Single().Value.ToString();
                 long microseconds = (DateTime.Now.Ticks - long.Parse(oldDt)) / 10;
                 Console.Write("\nExecution time for message(MessageID:{1}) is {0} microseconds\n", microseconds, mid);
             }
         }
         Util.waitForUser();
     };
     return serviceAction;
 }
    static void Main(string[] args)
    {
try
        {
            HiResTimer hres = new HiResTimer(); //High Resolution Timer
            Console.Write("\nStarting CommService write client");
            Console.Write("\n =============================\n");
            Console.Title = "Write Client";
            Message msg = new Message();
            WriterClient clnt = new WriterClient();
            clnt.processCommandLine(args);
            string localPort = Util.urlPort(clnt.localUrl);
            string localAddr = Util.urlAddress(clnt.localUrl);
            Receiver rcvr = new Receiver(localPort, localAddr);
            Action serviceAction = DefineServiceAction(hres, clnt, rcvr);
            if (rcvr.StartService())
                rcvr.doService(serviceAction);
            Sender sndr = new Sender(clnt.localUrl);  // Sender needs localUrl for start message         
            msg.fromUrl = clnt.localUrl;
            msg.toUrl = clnt.remoteUrl;
            Console.Write("Sender's url is {0}", msg.fromUrl);
            Console.Write("Attempting to connect to {0}\n", msg.toUrl);
            if (!sndr.Connect(msg.toUrl))
            {
                Console.Write("Could not connect in {0} attempts\n", sndr.MaxConnectAttempts);
                sndr.shutdown();
                rcvr.shutDown();
                return;
            }
            PerformanceTesting(hres, msg, clnt, rcvr, sndr);
        }
        catch (CustomException ex)
        {
            throw new CustomException("Error in main of writer client", ex);
        }
    }
 /// <summary>
 ///  Define service action that needs to be handled for receiver requests at the client
 /// </summary>
 /// <param name="hres"></param>
 /// <param name="clnt"></param>
 /// <param name="rcvr"></param>
 /// <returns></returns>
 private static Action DefineServiceAction(HiResTimer hres, WriterClient clnt, Receiver rcvr)
 {
     try
     {
         Action serviceAction = ServiceActionMake(hres, clnt, rcvr);
         return serviceAction;
     }
     catch (CustomException ex)
     {
         throw new CustomException("Error in define service action of writer client", ex);
     }
 }
 /// <summary>
 /// UpdatePerformance for the client
 /// </summary>
 /// <param name="msg"></param>
 /// <param name="clnt"></param>
 /// <param name="sndr"></param>
 /// <param name="xmlStr"></param>
 /// <param name="docTemp"></param>
 /// <param name="key"></param>
 /// <param name="msgid"></param>
 /// <param name="keyUp"></param>
 /// <param name="l"></param>
 private static void UpdatePerformance(Message msg, WriterClient clnt, Sender sndr, ref string xmlStr, out XDocument docTemp, string key, ref string msgid, out string keyUp, out XElement l)
 {
     //Update performance testing
     docTemp = XDocument.Load("Input.xml");
     keyUp = "";
     l = docTemp.Descendants("OperationMessage").Where(d => d.Element("Operation").Value == "Update").Select(i => i).Single();
     clnt.numMsgs = int.Parse(l.Elements("Count").Single().Value);
     clnt.total += clnt.numMsgs;
     for (int i = 0; i < clnt.numMsgs; i++)
     {
         if (key == "")
             keyUp = "2";
         else
             keyUp = key;
         xmlStr = clnt.UpdateGenerator(docTemp, ref msgid, ref keyUp, "");    //Generate data using the xml structure
         msg.content = xmlStr;
         if (clnt.loggingCheck == true)
             Console.Write("Sending Message..Message is \n {0} \n", msg.content);
         else
             Console.Write("Sending Message..Message(Message ID:{0})\n", msgid);
         if (sndr.sendMessage(msg))
         {
             Console.Write("\nUpdated entries in DB - Key:{0} ,MessageID: {1} successfully\n", key, msgid);
             Thread.Sleep(50);
         }
     }
 }
        /// <summary>
        /// DeletePerformance for the client
        /// </summary>
        /// <param name="msg"></param>
        /// <param name="clnt"></param>
        /// <param name="sndr"></param>
        /// <param name="xmlStr"></param>
        /// <param name="key"></param>
        /// <param name="msgid"></param>
        /// <param name="keyUp"></param>
        /// <param name="l"></param>
        /// <returns></returns>
        private static XDocument DeletePerformance(Message msg, WriterClient clnt, Sender sndr, ref string xmlStr, string key, ref string msgid, ref string keyUp, XElement l)
        {
            XDocument docTemp = XDocument.Load("Input.xml");
            XElement m = docTemp.Descendants("OperationMessage").Where(d => d.Element("Operation").Value == "Delete").Select(i => i).Single();
            clnt.numMsgs = int.Parse(l.Elements("Count").Single().Value);
            clnt.total += clnt.numMsgs;
            for (int i = 0; i < clnt.numMsgs; i++)
            {
                if (KeyLs.Get() != null)
                {
                    keyUp = KeyLs.LastElement().ToString();
                    //keyUp = KeyLs.Get()[0].ToString();
                    KeyLs.Remove(int.Parse(keyUp));
                }
                else
                    keyUp = 2.ToString();
                //Construct DB Delete
                xmlStr = clnt.WriteDataForDelete(docTemp, ref msgid, ref keyUp);    //Generate data using the xml structure
                msg.content = xmlStr;
                if (clnt.loggingCheck == true)
                    Console.Write("Sending Message..Message is \n {0} \n", msg.content);
                else
                    Console.Write("Sending Message..Message(Message ID:{0})\n", msgid);
                if (sndr.sendMessage(msg))
                {
                    Console.Write("Message(MessageID {1},Key {0}) sent for deletion successfully\n", key, msgid);
                    Thread.Sleep(50);
                }
            }

            return docTemp;
        }
        /// <summary>
        /// Insert performance results writer client
        /// </summary>
        /// <param name="hres"></param>
        /// <param name="msg"></param>
        /// <param name="clnt"></param>
        /// <param name="sndr"></param>
        /// <param name="xmlStr"></param>
        /// <param name="docTemp"></param>
        /// <param name="key"></param>
        /// <param name="msgid"></param>
        /// <returns></returns>
        private static string InsertPerformance(HiResTimer hres, Message msg, WriterClient clnt, Sender sndr, string xmlStr, out XDocument docTemp, out string key, out string msgid)
        {
            docTemp = XDocument.Load("Input.xml");
            XElement k = docTemp.Descendants("OperationMessage").Where(d => d.Element("Operation").Value == "Insert").Select(i => i).Single();
            if (k.Elements("Count").Single().Value != "")
                clnt.numMsgs = int.Parse(k.Elements("Count").Single().Value);
            clnt.total += clnt.numMsgs;
            hres.Start();     //High resolution timer started     
            key = "";
            msgid = "";
            for (int i = 0; i < clnt.numMsgs; i++)
            {
                docTemp = XDocument.Load("Input.xml");
                xmlStr = clnt.InsertGenerator(docTemp, ref msgid, ref key, "int");    //Generate data using the xml structure
                msg.content = xmlStr;
                msg.fromUrl = clnt.localUrl;
                msg.toUrl = clnt.remoteUrl;
                if (sndr.sendMessage(msg))
                {
                    Console.Write("Sent message(Message ID {0}) to insert into DB successfully\n", msgid);
                    Thread.Sleep(50);
                }
            }

            return xmlStr;
        }
 /// <summary>
 ///  Performance testing by inserting items
 /// </summary>
 /// <param name="hres"></param>
 /// <param name="msg"></param>
 /// <param name="clnt"></param>
 /// <param name="rcvr"></param>
 /// <param name="sndr"></param>
 private static void PerformanceTesting(HiResTimer hres, Message msg, WriterClient clnt, Receiver rcvr, Sender sndr)
 {
     try
     {
         XmlTextReader textReader = new XmlTextReader("Input.xml");
         string xmlStr = "";
         HiResTimer t = new HiResTimer();
         t.Start();
         if (File.Exists("Input.xml"))
         {
             XDocument docTemp;
             string key, msgid;
             xmlStr = InsertPerformance(hres, msg, clnt, sndr, xmlStr, out docTemp, out key, out msgid);
             string keyUp;
             XElement l;
             UpdatePerformance(msg, clnt, sndr, ref xmlStr, out docTemp, key, ref msgid, out keyUp, out l);
             //Delete entries
             docTemp = DeletePerformance(msg, clnt, sndr, ref xmlStr, key, ref msgid, ref keyUp, l);
         }
         t.Stop();
         clnt.WriteClientTime = t.ElapsedMicroseconds;
         msg = new Message();
         msg.fromUrl = clnt.localUrl;
         msg.toUrl = clnt.remoteUrl;
         msg.content = "done";
         sndr.sendMessage(msg);
         // Wait for user to press a key to quit.
         Util.waitForUser();
         // shut down this client's Receiver and Sender by sending close messages
         rcvr.shutDown();
         sndr.shutdown();
         Console.Write("\n\n");
     }
     catch (CustomException ex)
     {
         throw new CustomException("Error in main of peformance testing", ex);
     }
 }