public void InternalRun() { while (_isStart) { CmdTask task = _queue.Dequeue(1); if (task == null) { continue; } var systemIdx = task.TaskInfo.SystemIdx; try { SingletonManager.Get <DurationHelp>().ProfileStart(_systemsProfiles[systemIdx]); var sytstem = _systems[systemIdx]; sytstem.ExecuteUserCmd(task.Owner, task.UserCmd); _logger.DebugFormat("{0} Execute :{1} seq:{2} player:{3}", Name, systemIdx, task.UserCmd.Seq, task.Owner.OwnerEntityKey.EntityId); } catch (Exception e) { _logger.ErrorFormat("Execute :{0} Exception:{1}", _systems[systemIdx], e); } finally { SingletonManager.Get <DurationHelp>().ProfileEnd(_systemsProfiles[systemIdx]); _disparcher.TaskEnd(task); } } }
public void TaskEnd(CmdTask cmdTask) { var idx = cmdTask.PayerIdx; Interlocked.Decrement(ref _taskRunCounts[idx]); _logger.DebugFormat("{0} TaskEnd :{1} statue:{1}", idx, cmdTask.TaskInfo.SystemIdx, _taskRunCounts[idx]); }
private void DispatchTask(CmdTask task) { if (task.TaskInfo.Thread == TaskThread.MainThread) { _mainThread.Offer(task); } else { _slaveThreads[task.ThreadIdx].Offer(task); } }
public void Offer(CmdTask task) { _queue.Enqueue(task); }
protected override void Run() { Thread.CurrentThread.Name = GetType().ToString(); while (Running) { if (IsStart) { try { int count = _userCount; bool isAllDone = true; for (int playerIdx = 0; playerIdx < count; playerIdx++) { var queue = _taskDictionary[playerIdx]; if (_taskRunCounts[playerIdx] == 0 && queue.Count == 0) //提交的任务和队列的任务个数都为0 { continue; } isAllDone = false; if (_taskRunCounts[playerIdx] == 0) { bool flag = true; int lastThreadIdx = -1; TaskThread lastThread = TaskThread.END; int batchCount = 0; bool hasTask = false; while (flag) { flag = false; if (queue.Count > 0) { CmdTask task = (CmdTask)queue.Peek(); hasTask = true; if (lastThread == TaskThread.END) { lastThread = task.TaskInfo.Thread; lastThreadIdx = task.ThreadIdx; } if (task.TaskInfo.Thread == lastThread && task.ThreadIdx == lastThreadIdx) { batchCount++; flag = true; task = (CmdTask)queue.Dequeue(); Interlocked.Increment(ref _taskRunCounts[playerIdx]); _logger.DebugFormat("Offer :{0} thread:{1} batch{2} _taskRunCounts{3}", task.TaskInfo.SystemIdx, task.TaskInfo.Thread, batchCount, _taskRunCounts[playerIdx]); DispatchTask(task); } } } if (!hasTask) { _logger.DebugFormat("{0} no more tasks", playerIdx); } } } if (isAllDone) { NotifyALlThreadAllDone(); IsStart = false; } } catch (Exception e) { _logger.ErrorFormat("{0}", e); NotifyALlThreadAllDone(); IsStart = false; } } else { // NotifyALlThreadAllDone(); // isStart = false; Thread.Sleep(1); } } }