예제 #1
0
        private void UnLock(long key)
        {
            this.lockDict.Remove(key);

            if (!this.taskQueues.TryGetValue(key, out Queue <LocationTask> tasks))
            {
                return;
            }

            while (true)
            {
                if (tasks.Count <= 0)
                {
                    this.taskQueues.Remove(key);
                    return;
                }
                if (this.lockDict.ContainsKey(key))
                {
                    return;
                }

                LocationTask task = tasks.Dequeue();
                try
                {
                    task.Run();
                }
                catch (Exception e)
                {
                    Log.Error(e);
                }
                task.Dispose();
            }
        }
예제 #2
0
        /// <summary>
        /// 解锁
        /// </summary>
        /// <param name="key"></param>
        private void UnLock(long key)
        {
            this.lockDict.Remove(key);
            //加锁后所有获取地址的请求全部都搁置,等待玩家转换完成后再处理。
            //这样,获取的地址才是正确的。而搁置的请求,则会以LocationTask储存在taskQueues字典里

            //遍历Task堆栈字典字典taskQueues中  回复之前的位置请求
            if (!this.taskQueues.TryGetValue(key, out Queue <LocationTask> tasks))
            {
                return;
            }

            while (true)
            {
                if (tasks.Count <= 0)                 //执行完就跳出
                {
                    this.taskQueues.Remove(key);
                    return;
                }
                if (this.lockDict.ContainsKey(key))
                {
                    return;
                }

                LocationTask task = tasks.Dequeue();
                try
                {
                    task.Run();                      //将此key下堆栈中的Task任务全部执行
                }
                catch (Exception e)
                {
                    Log.Error(e);
                }
                task.Dispose();                  //释放
            }
        }