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); }
/// <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); //入栈 }
/// <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(); //释放 } }