void Beat(Object state) { //启动超时判定 TimeOut.Change(TimeoutPeriod, Timeout.Infinite); /// /// 发送请求 /// reqSock.SendMessage(msg); /// /// 接收回来的消息 /// var repMsg = reqSock.ReceiveMessage(); if (repMsg != null && repMsg.FrameCount > 0) { TimeOut.Change(Timeout.Infinite, Timeout.Infinite); int heart = repMsg[0].ConvertToInt32(); ConsoleEx.DebugLog("Heart from Server : " + heart.ToString()); //开始下一个时间任务 if (heart == 1) { RepeatTimer.Change(IntervalPeriod, Timeout.Infinite); } } }
// we can ignore "state" param void ComputeBoundOp(Object state) { IsRunning = true; if (cachedServerTime > 0) { curUtc = cachedServerTime; cachedServerTime = 0; } curUtc++; //申请读锁 #region require Read lock m_readerWriterLock.EnterReadLock(); if (TaskDic != null) { //清空状态 ActionList.Clear(); ToBeRemoved.Clear(); foreach (int TaskId in TaskDic.Keys) { TimerTask task = TaskDic[TaskId]; if (task != null) { task.leftTime = task.endTime - curUtc; task.leftTime = task.leftTime <= 0 ? 0 : task.leftTime; if (task.leftTime == 0 && task.endTime != TimerTask.INFINITY) { ToBeRemoved.Add(TaskId); } if (task.startTime == curUtc) { ActionList.Enqueue(task.handleStart); } if (task.endTime == curUtc) { ActionList.Enqueue(task.handleCompleted); } if (curUtc > task.startTime && (curUtc < task.endTime || task.endTime == TimerTask.INFINITY)) { if (task.frequency == TimerTask.NO_FREUENCY) { // do thing ... } else { if (task.curFre > 1) { task.curFre--; } else { task.curFre = task.frequency; ActionList.Enqueue(task.handleOnEvent); } } } } } } //释放读锁 m_readerWriterLock.ExitReadLock(); #endregion //申请写锁 m_readerWriterLock.EnterWriteLock(); if (TaskDic != null) { foreach (int key in ToBeRemoved) { TaskDic.Remove(key); } } ToBeRemoved.Clear(); //释放写锁 m_readerWriterLock.ExitWriteLock(); // --------- 开始执行 ---------- ThreadPool.QueueUserWorkItem( (actions) => { Action[] WorkList = (actions as Queue <Action>).ToArray(); if (WorkList != null) { foreach (Action work in WorkList) { if (work != null) { try { work(); } catch (Exception ex) { ConsoleEx.DebugLog(ex.Message); } } } } }, ActionList ); //开始下一个时间任务 threadTimer.Change(IntervalPeriod, Timeout.Infinite); }