private TCounter SetWaitFlag(EMessage msg, int timeout)  // set the wait flag of a request message at given timeout milliseconds
        {
            var tc = new TCounter(msg, timeout);

            lock (dictMsgId2TC) dictMsgId2TC[msg.ID] = tc;
            return(tc);
        }
        private void _processInMessage(object msgObj)  // async method
        {
            var msg = msgObj as EMessage;

            try
            {
                // pre-processing
                PreprocessInMessage(ref msg);

                logger.Write(LogType.IN, msg);

                if (msg.HasFlag(StatusCode.Response))
                {
                    TCounter tc = null;
                    lock (dictMsgId2TC)
                    {
                        dictMsgId2TC.TryGetValue(msg.ID, out tc);
                    }

                    if (tc != null)
                    {
                        tc.SetReply(msg);
                        RemoveWaitFlag(msg.ID);

                        ProcessResponse(tc.RequestMsg, tc.ResponseMsg);
                    }
                }

                if (msg.HasFlag(StatusCode.Request))
                {
                    ProcessRequest(ref msg);
                    if (!msg.HasFlag(StatusCode.NoAutoReply))
                    {
                        Response(msg);
                    }
                }
            }
            catch (Exception ex)
            {
                this.Catch(new EOCException(ex));
            }
        }