1. 程式人生 > 實用技巧 >.NetCore 執行緒安全的ConcurrentQueue<T>佇列

.NetCore 執行緒安全的ConcurrentQueue<T>佇列

摘要:最近辦了一件蠢事,我在一個高併發的訂閱事件裡對資料庫執行I/O操作 ,坑了自己一把,雖然定時清除了資料,但是跑了一段時間之後還是出問題了,後面就加入了佇列去儲存一段時間的資料,解決了這個問題,操作記憶體和磁碟不是一個級別的.特別是高併發的情況下,最好別對磁碟進行I/O操作,用不好只能坑了自己.

這裡簡單粘一下佇列的使用方法,因為用的是多執行緒,就選擇了ConcurrentQueue,還有一些別的Queue方法,有興趣可以去搜一下.

ConcurrentQueue<T>佇列是一個高效的執行緒安全的佇列,是.Net Framework 4.0,System.Collections.Concurrent名稱空間下的一個數據結構

ConcurrentQueue是一個先進先出的佇列,常用的有以下幾個方法:

  • Enqueue(T item)將物件新增到佇列的結尾處
  • TryDequeue(out T result)嘗試移除並返回併發佇列開頭處的物件
  • TryPeek(out T result)嘗試返回開頭處的物件但不將其移除

以下是我封裝的常用類

    public class RingStringBuilder
    {
        private static ConcurrentQueue<RealTimeInfo> concurrentQueue = new ConcurrentQueue<RealTimeInfo>();
        
private static int _maxCapacity;//佇列最大值 public RingStringBuilder(int maxCapacity) { _maxCapacity = maxCapacity; } /// <summary> /// 根據佇列設定的最大值判斷 /// 超過最大值,移除佇列第一條,佇列末尾新增一條 /// 沒超過最大值,一直在佇列尾部新增 /// </summary> /// <param name="info"></param>
public static void Append(RealTimeInfo info) { concurrentQueue.Enqueue(info); if (concurrentQueue.Count > _maxCapacity) { concurrentQueue.TryDequeue(out info); } } /// <summary> /// 查詢列表 /// </summary> /// <returns></returns> public static List<RealTimeInfo> Query() { return concurrentQueue.ToList(); } /// <summary> /// 獲取最後一條資料 /// </summary> /// <returns></returns> public static RealTimeInfo GetLastOrDefault() { return concurrentQueue.LastOrDefault(); } /// <summary> /// 獲取第一條資料 /// </summary> /// <param name="info"></param> /// <returns></returns> public static RealTimeInfo GetFirstOrDefault(out RealTimeInfo info) { concurrentQueue.TryPeek(out info); return info; } }