/// <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); } } } }