[C#] 節流策略 - Debounce & Throttle
最近有一個案子類似搶票功能,雖然公司流量跟台鐵相比真的不足為奇,但因同事們撰寫程式都會發生超賣或太慢的狀況,導致主管總覺得這個很複雜。 當然超賣的根本原因跟節流沒有太大的關係,這部分有機會再紀錄。 主要是設計架構上可以透過節流策略,加強系統的承載能力,所以實作該策略了。 Debounce(去抖動) ● 作用:在事件頻繁觸發時,只在最後一次事件觸發後的一段時間內執行。 ● 特點:若在等待時間內再次觸發,計時器重置,直到最後一次觸發後才執行。 ● 應用場景:表單輸入自動保存、搜尋框輸入後延遲查詢、網路請求。 Throttle(節流) ● 作用:在固定的時間間隔內限制事件的觸發次數。 ● 特點:保證在特定時間段內最多執行一次,即使事件頻繁觸發。 ● 應用場景:滾動監聽、按鈕防連點、視窗調整大小事件、網路請求。 Trailing Throttle(結合去抖動和節流) ● 作用:在固定的時間間隔內限制事件的觸發次數,並 確保執行最後一次 事件 。 ● 特點:保證在特定時間段內最多執行一次,即使事件頻繁觸發,且會 執行最後一次事件 。 ● 應用場景: 節流情境下,但需要執行最後一次 事件 。 這邊也附上一個js的應用場景( throttle vs debounce ),比起rxjs的圖,這應該是最好理解的方式了,大家可以觀察一下兩者的區別。 Debounce(去抖動) using System; using System; using System.Collections.Concurrent; using System.Threading; using System.Threading.Tasks; public static class Debouncer { static ConcurrentDictionary _tokens = new ConcurrentDictionary (); public static void Debounce(string uniqueKey, Action action, int millisecondsDelay) { // 如果已經存在 uniqueKey 的 ...