public void LoadResourceAsync(object user, LoadRequestInfo[] requests, System.Action hdlSuccess, System.Action <string> hdlError) { if (!CheckCanLoad()) { return; } string isError = string.Empty; List <LoadRequestInfo> loadedRequests = new List <LoadRequestInfo> (); System.Action unloadFinishLoad = () => { for (int j = 0; j < loadedRequests.Count; ++j) { LoadRequestInfo loadedRequest = loadedRequests[j]; UnloadResource(GetResourcePath(loadedRequest.resourceName, loadedRequest.resourceType)); } loadedRequests.Clear(); }; for (int i = 0; i < requests.Length; ++i) { LoadRequestInfo loadRequest = requests [i]; string resourcePaht = GetResourcePath(loadRequest.resourceName, loadRequest.resourceType); LoadResourceAsync(user, resourcePaht, loadRequest.resourceType, delegate(Object obj) { if (user.Equals(null) || !string.IsNullOrEmpty(isError)) { obj = null; UnloadResource(resourcePaht); unloadFinishLoad(); } else { loadRequest.resourceObj = obj; loadedRequests.Add(loadRequest); if (loadedRequests.Count >= requests.Length) { hdlSuccess.Invoke(); } } }, delegate(string errorCode) { unloadFinishLoad(); if (string.IsNullOrEmpty(isError) && !user.Equals(null)) { hdlError.Invoke(errorCode); } isError = true.ToString(); }); } }
private void OnTick() { long curTime = TimeUtility.GetLocalMilliseconds(); if (m_LastTickTime != 0) { long elapsedTickTime = curTime - m_LastTickTime; if (elapsedTickTime > c_WarningTickTime) { LogSys.Log(LOG_TYPE.MONITOR, "DataCacheThread Tick:{0}", elapsedTickTime); } } m_LastTickTime = curTime; if (m_LastLogTime + 60000 < curTime) { m_LastLogTime = curTime; DebugPoolCount((string msg) => { LogSys.Log(LOG_TYPE.INFO, "DataCacheThread.DispatchActionQueue {0}", msg); }); DebugActionCount((string msg) => { LogSys.Log(LOG_TYPE.MONITOR, "DataCacheThread.DispatchActionQueue {0}", msg); }); LogSys.Log(LOG_TYPE.MONITOR, "DataCacheThread.ThreadActionQueue Current Action {0}", m_Thread.CurActionNum); LogSys.Log(LOG_TYPE.MONITOR, "DataCacheThread Load Request Count {0} Save Request Count {1}", CalcLoadRequestCount(), CalcSaveRequestCount()); } if (UserServerConfig.DataStoreAvailable == true) { if (m_LastOperateTickTime + c_OperateTickInterval < curTime) { m_LastOperateTickTime = curTime; //Load操作 foreach (var pair in m_LoadRequests) { int msgId = pair.Key; ConcurrentDictionary <KeyString, LoadRequestInfo> dict = pair.Value; foreach (var reqPair in dict) { KeyString primaryKey = reqPair.Key; LoadRequestInfo req = reqPair.Value; if (req.m_LastSendTime + UserServerConfig.DSRequestTimeout < curTime) { m_WaitDeletedLoadRequests.Add(primaryKey, req.m_Request.SerialNo); Msg_DL_LoadResult result = new Msg_DL_LoadResult(); result.MsgId = msgId; result.PrimaryKeys.AddRange(primaryKey.Keys); result.SerialNo = req.m_Request.SerialNo; result.ErrorNo = Msg_DL_LoadResult.ErrorNoEnum.TimeoutError; result.ErrorInfo = "Timeout Error"; if (null != req.m_Callback) { DispatchAction(req.m_Callback, result); } } } foreach (var delPair in m_WaitDeletedLoadRequests) { LoadRequestInfo info; if (dict.TryRemove(delPair.Key, out info)) { if (info.m_Request.SerialNo == delPair.Value) { m_LoadRequestPool.Recycle(info); } else { dict.TryAdd(delPair.Key, info); } } } m_WaitDeletedLoadRequests.Clear(); } //Save操作 foreach (var pair in m_SaveRequestQueues) { int msgId = pair.Key; ConcurrentDictionary <KeyString, ConcurrentQueue <SaveRequestInfo> > dict = pair.Value; foreach (var reqPair in dict) { KeyString primaryKey = reqPair.Key; ConcurrentQueue <SaveRequestInfo> saveReqQueue = reqPair.Value; SaveRequestInfo req; if (saveReqQueue.TryPeek(out req)) { if (req.m_LastSendTime + UserServerConfig.DSRequestTimeout < curTime) { //超时,重新发送 LogSys.Log(LOG_TYPE.ERROR, "DataCacheThread. SaveRequest timeout. MsgId:{0}, PrimaryKey:{1}, SerialNo:{2}", msgId, KeyString.Wrap(req.m_Request.PrimaryKeys), req.m_Request.SerialNo); m_DataStoreChannel.Send(req.m_Request); req.m_LastSendTime = curTime; } } if (dict.Count > c_MaxRecordPerMessage && saveReqQueue.Count == 0) { m_WaitDeleteSaveRequests.Add(primaryKey); } } foreach (KeyString key in m_WaitDeleteSaveRequests) { lock (m_SaveRequestQueuesLock) { ConcurrentQueue <SaveRequestInfo> queue; if (dict.TryGetValue(key, out queue)) { if (queue.Count == 0) { ConcurrentQueue <SaveRequestInfo> dummy; dict.TryRemove(key, out dummy); } } } } m_WaitDeleteSaveRequests.Clear(); } } if (m_LastDSConnectTime + c_DSConnectInterval < curTime) { m_LastDSConnectTime = curTime; if (m_CurrentStatus != ConnectStatus.Connected) { ConnectDataStore(); } } } }