• the wait queue


    using System;
    using System.Collections.Concurrent;
    using System.Threading;
    
    namespace Base
    {
        public class WaitQueue<T> : IDisposable where T : class
        {
            /// <summary>
            /// The deal action.
            /// </summary>
            public Action<T> DealAction { get; set; }
    
            /// <summary>
            /// The inner queue.
            /// </summary>
            private readonly ConcurrentQueue<T> _innerQueue;
    
            /// <summary>
            /// The deal thread.
            /// </summary>
            private readonly Thread dealThread;
    
            /// <summary>
            /// The flag for end thread.
            /// </summary>
            private bool endThreadFlag = false;
    
            /// <summary>
            /// The auto reset event.
            /// </summary>
            private readonly AutoResetEvent autoResetEvent = new AutoResetEvent(true);
    
            /// <summary>
            /// Initializes a new instance of the WaitQueue`1 class.
            /// </summary>
            public WaitQueue()
            {
                this._innerQueue = new ConcurrentQueue<T>();
                this.dealThread = new Thread(this.DealQueue);
                this.dealThread.Start();
            }
    
            /// <summary>
            /// Disposes current instance, end the deal thread and inner queue.
            /// </summary>
            public void Dispose()
            {
                this.endThreadFlag = true;
                this._innerQueue.Enqueue(null);
                this.autoResetEvent.Set();
                this.dealThread.Join();
                this.autoResetEvent.Close();
            }
    
            /// <summary>
            /// Save entity to Queue.
            /// </summary>
            /// <param name="entity">The entity what will be deal.</param>
            public void SaveLog(T entity)
            {
                this._innerQueue.Enqueue(entity);
                this.autoResetEvent.Set();
            }
    
            /// <summary>
            /// Out Queue.
            /// </summary>
            /// <param name="entity">The init entity.</param>
            /// <returns>The entity what will be deal.</returns>
            private bool Dequeue(out T entity)
            {
                return this._innerQueue.TryDequeue(out entity);
            }
    
            /// <summary>
            /// Deal entity in Queue.
            /// </summary>
            private void DealQueue()
            {
                while (true)
                {
                    T entity;
                    if (this.Dequeue(out entity))
                    {
                        if (this.endThreadFlag && entity == null)
                        {
                            return;   // Exit the deal thread.
                        }
    
                        try
                        {
                            if (this.DealAction != null)
                            {
                                this.DealAction(entity);
                            }
                        }
                        catch
                        {
                        }
                    }
                    else
                    {
                        this.autoResetEvent.WaitOne();
                    }
                }
            }
        }
    }
    

     

  • 相关阅读:
    排序算法(一)之冒泡排序
    递归思想
    排序算法(四)之归并排序
    排序算法(三)之插入排序
    Config 摆脱配置的烦恼
    Mysql查看正在执行的Sql进程
    Scala笔记
    WPF之AvalonEdit实现MVVM双向绑定
    2021最新 MySQL常见面试题精选(附刷题小程序)
    IDEA控制台乱码
  • 原文地址:https://www.cnblogs.com/12taotie21/p/5135159.html
Copyright © 2020-2023  润新知