Beispiel #1
0
    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();
            });
        }
    }
Beispiel #2
0
        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();
                    }
                }
            }
        }