Example #1
0
        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);
                }
            }
        }
Example #2
0
        // 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);
        }