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