public void Load <T>(string key, LoadCallback <T> cb) where T : IMessage { uint dsMsgId = MessageMapping.Query(typeof(T)); if (dsMsgId == uint.MaxValue) { cb(DSLoadResult.PrepError, string.Format("unknown data message: {0}", typeof(T).Name), default(T)); return; } string timeoutKey = string.Format("{0}:{1}", dsMsgId, key); if (loadOpt_timeout_.Exists(timeoutKey)) { cb(DSLoadResult.PrepError, "Load operation are too frequent", default(T)); } else { LNReq_Load.Builder loadBuilder = LNReq_Load.CreateBuilder(); loadBuilder.SetDsMsgId(dsMsgId); loadBuilder.SetKey(key); LNReq_Load loadData = loadBuilder.Build(); if (!channel_.Send(loadData)) { cb(DSLoadResult.PrepError, "Create protobuf data error.", default(T)); } else { LoadCBBox cbbox = new LoadCBBoxI <T>(cb); string timeoutTip = string.Format("DataStore load request timeout. MsgId:{0}, Key:{1}", dsMsgId, key); loadOpt_timeout_.Set(timeoutKey, cbbox, () => cbbox.Invoke(DSLoadResult.TimeoutError, timeoutTip, null)); } } }