Ejemplo n.º 1
0
        /// <summary>
        /// 次のタイマーの位置へ進める
        /// </summary>
        private void Increment()
        {
            if (timerCollection.Count > 0)
            {
                if (index >= timerCollection.Count)
                {
                    index = 0;
                }

                current = (TimerObject)timerCollection[index++];
                current.Start();
                running = true;
            }
            else
            {
                running = false;
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// リストにクライアントを追加。
        /// 既に同じクライアントが登録されていれば何もしない。
        /// </summary>
        /// <param name="client">自動更新の対象とするクライアント</param>
        public override void Add(ThreadControl client)
        {
            if (client == null)
            {
                throw new ArgumentNullException("client");
            }

            if (IndexOf(client) == -1)
            {
                client.Complete += new CompleteEventHandler(OnComplete);

                TimerObject timer =
                    new TimerObject(client, Interval, new ElapsedEventHandler(OnTimer));

                lock (timerList)
                {
                    timerList.Add(timer);
                }

                timer.Start();
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        /// スレッド更新完了イベント発生
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OnComplete(object sender, CompleteEventArgs e)
        {
            ThreadControl thread = (ThreadControl)sender;
            TimerObject   timer  = null;

            int index = IndexOf(thread);

            if (index >= 0)
            {
                lock (timerList)
                {
                    timer = timerList[index];
                }

                if (e.Status == CompleteStatus.Success)
                {
                    bool modified = (thread.HeaderInfo.NewResCount > 0);

                    // 新着が無く、最大レス数を越えていた場合、
                    // または再試行回数が 0 回になっていればタイマーから外す
                    if (thread.HeaderInfo.IsLimitOverThread && !modified)
                    {
                        Remove(thread);
                    }
                    else if (timer.RetryCount == 0 && !modified)
                    {
                        Remove(thread);
                    }
                    else
                    {
                        // 新着があれば間隔を縮める、なければ間隔をのばす
                        timer.Interval = modified ? (int)(timer.Interval / 1.5) : (int)(timer.Interval * 1.5);

                        // 新着があった場合は再試行回数をリセット。
                        if (modified)
                        {
                            timer.ResetRetryCount();
                            timer.Interval = interval;
                        }
                        // 最大 30分 を越えた場合は再試行回数を減らす
                        else if (timer.Interval > MaxInterval)
                        {
                            timer.Interval = MaxInterval;
                            timer.RetryCount--;
                        }

                        timer.Start();
                    }
                }
                else
                {
                    // 更新に失敗した場合は、3回だけ再試行してみる
                    if (timer.RetryCount > 0)
                    {
                        timer.RetryCount--;
                        timer.Start();
                    }
                    // それでもダメなら間隔を最大に延ばしてさらに3回だけ再試行。
                    else if (timer.Interval < MaxInterval)
                    {
                        timer.ResetRetryCount();
                        timer.Interval = MaxInterval;
                        timer.Start();
                    }
                    // それでもダメならオートリロード停止
                    else
                    {
                        Remove(thread);
                    }
                }
            }
        }