public AsyncMessageSender CreateCommunicator(string commName, string mainName, string subName, string subKey, bool isMain, Action<string, object> receiveMessageProcessor)
 {
     AsyncMessageReceiver receiver = null;
     
     string mainToSubQueueName = string.Format("{0}_{1}_TO_{2}_{3}", commName, mainName, subName, subKey);
     string subToMainQueueName = string.Format("{0}_{1}_TO_{2}", commName, subName, mainName);
     
     if (isMain)
     {
         //main's receiver(DSDPS_CLIENT_SERVER) is shared on same system.
         if (subToMainReceiverDic.ContainsKey(subToMainQueueName))
         {
             receiver = subToMainReceiverDic[subToMainQueueName];
         }
         else
         {
             receiver = new AsyncMessageReceiver(commName, mainName, subName, subKey, isMain, receiveMessageProcessor);
             receiver.Init();
             subToMainReceiverDic.Add(subToMainQueueName, receiver);
         }
         //main's sender(DSDPS_SERVER_CLIENT_XXXX) is not shared.
         return new AsyncMessageSender(commName, mainName, subName, subKey, isMain, receiver);
     }
     else
     {
         //sub's receiver is not shared.
         receiver = new AsyncMessageReceiver(commName, mainName, subName, subKey, isMain, receiveMessageProcessor);
         receiver.Init();
         //sub's sender(DSDPS_CLIENT_SERVER) is shared, eg only one sender exists on system.
         if (subToMainSenderDic.ContainsKey(subToMainQueueName))
         {
             return subToMainSenderDic[subToMainQueueName];
         }
         else
         {
             AsyncMessageSender sender = new AsyncMessageSender(commName, mainName, subName, subKey, isMain, receiver);
             subToMainSenderDic.Add(subToMainQueueName, sender);
             return sender;
         }
     }
 }
        public AsyncMessageSender(string commName, string mainName, string subName, string subKey, bool isMain, AsyncMessageReceiver receiver)
        {
            this.isMain = isMain;
            this.commName = commName;
            this.mainName = mainName;
            this.subName = subName;

            string mainToSubQueueName = string.Format("{0}_{1}_TO_{2}_{3}", commName, mainName, subName, subKey);
            string subToMainQueueName = string.Format("{0}_{1}_TO_{2}", commName, subName, mainName);
            if (isMain)
            {
                senderQueueName = mainToSubQueueName;
            }
            else
            {
                senderQueueName = subToMainQueueName;
            }
            this.receiver = receiver;
        }