public void AddTask(long key, LocationTask task)
 {
     if (!this.taskQueues.TryGetValue(key, out Queue <LocationTask> tasks))
     {
         tasks = new Queue <LocationTask>();
         this.taskQueues[key] = tasks;
     }
     tasks.Enqueue(task);
 }
Beispiel #2
0
 /// <summary>
 /// 添加到taskQueues字典中
 /// </summary>
 /// <param name="key"></param>
 /// <param name="task"></param>
 public void AddTask(long key, LocationTask task)
 {
     //可能会有多个请求得到一个角色的服务器ID
     if (!this.taskQueues.TryGetValue(key, out Queue <LocationTask> tasks))
     {
         tasks = new Queue <LocationTask>();
         this.taskQueues[key] = tasks;
     }
     tasks.Enqueue(task);             //入栈
 }
Beispiel #3
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();                  //释放
            }
        }