多线程列队执行 ThreadPool.QueueUserWorkItem 的使用

    public partial class Form1 : Form
    {
        protected NLog.Logger logger = NLog.LogManager.GetLogger("ThreadUpload");
        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 上传
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            List<string> data = new List<string>();
            for (int i = 0; i < 1000; i++)
            {
                data.Add(i.ToString());
            }
            ToPagingProcess(data, 1000);
        }


        #region

        private void ThreadMethod(object obj)
        {
            Param pra = (Param)obj;
            try
            {
                #region 提交数据
                Thread.Sleep(2000);
                #endregion
                if (pra.fileShipmentsEntityList != null)
                {
                    for (int i = 0; i < pra.fileShipmentsEntityList.Count; i++)
                    {
                        logger.Error("时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "执行数据:" + pra.fileShipmentsEntityList[i]);
                    }

                }

            }
            catch (Exception ex)
            {
                logger.ErrorException("ThreadMethod()", ex);
            }
            pra.mrEvent.Set();

            lock (locker)
            {
                finishcount++;
                Monitor.Pulse(locker); //完成,通知等待队列,告知已完,执行下一个。
            }
        }

        int _ThreadCount = 500;
        int finishcount = 0;
        object locker = new object();

        List<ManualResetEvent> manualEvents = new List<ManualResetEvent>();
        protected void ToPagingProcess<TEntity>(IEnumerable<TEntity> item, int pageSize)
        {
            finishcount = 0;
            _ThreadCount = pageSize;
            if (item != null && item.Count() > 0)
            {
                int SingleSendArrival = 1;
                for (int i = 1; i <= pageSize; i++)
                {
                    var currentPageItem = item.Skip((i - 1) * SingleSendArrival).Take(SingleSendArrival);
                    ManualResetEvent mre = new ManualResetEvent(false);
                    manualEvents.Add(mre);
                    Param pra = new Param();
                    pra.mrEvent = mre;
                    pra.fileShipmentsEntityList = new List<string>();
                    foreach (var itm in currentPageItem)
                    {
                        pra.fileShipmentsEntityList.Add(itm as string);
                    }
                    ThreadPool.QueueUserWorkItem(ThreadMethod, pra);
                }

                lock (locker)
                {
                    while (finishcount != _ThreadCount)
                    {
                        Monitor.Wait(locker);//等待
                    }
                }
            }
            //执行完毕
            //RefreshHawbList();
        }
        #endregion
    }

    public class Param
    {
        public string SubType;
        public ManualResetEvent mrEvent;
        public List<string> fileShipmentsEntityList;
    }

 

posted @ 2022-05-24 09:28  居~  阅读(627)  评论(0编辑  收藏  举报