Beispiel #1
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);
                    }
                }
            }
        }