前些時間在做老師佈置的一個CRM項目,其中項目裏需要做一個日程相關提醒的功能,想一想如果是用Timer控件每隔一秒不停的執行輪詢定時 時間列表的話,也不是一個很好的設計思路,至少效率不是很好,最後老師給我們提了一個MSDN上的時間比較算法,讓我們自己研究,然後再運用到項目裏去,隨後就在MSDN上找到了具體這個算法實現,用起來還是比較的靈活,至少我認爲是這樣,下面是具體的實現:
/// <summary>
/// 比較兩時間的在允許的範圍內是否相等
/// </summary>
/// <param name="time">第一個時間</param>
/// <param name="setTime">設置的時間</param>
/// <param name="allowRange">允許的範圍(s)</param>
/// <param name="frequencyInSeconds">循環的時間週期(s)</param>
/// <returns>True:相等 False:不相等</returns>
public static bool Compare(DateTime time, DateTime setTime, int allowRange, int frequencyInSeconds)
{- long delta = (long)((TimeSpan)(setTime - time)).TotalSeconds % frequencyInSeconds;
- delta = delta > allowRange ? frequencyInSeconds - delta : delta;
- return Math.Abs(delta) < allowRange;
- }
根據以上的方法參數的描述,不難發現如果用戶對時間的準確度要求不是特別精確的話,我們可以將所允許的時間範圍設置大一些,然後再將Timer控件的Interval屬性設置爲allowRange的兩倍,注意必須是allowRange兩倍的,否則會出現不提示,或者在allowRange範圍內提醒多次的情況,舉個例子:比如用戶設定時間是在當天的8:35:00 提醒,允許提醒在allowRange=5分鐘的範圍內。如果將Timer的Interval屬性設置爲20分鐘,有可能Timer是在8:25進入間隔時間段,也就是說Timer下次執行要在8:45發生,則就會錯過了用戶設定的提醒時間而導致沒有提醒的現象,設置的Timer間隔小於allowRange可能會出現一個allowRange內會出現多次提醒的現象,具體情況可根據上一個例子來分析一下!