• 多线程列队执行 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;
        }
  • 相关阅读:
    Jenkins入门教程(3)
    Jenkins入门教程(2)
    Jenkins入门教程(1)
    Tomcat与Weblogic
    fidder教程
    postman教程(3)- 用Postman生成Request代码
    postman教程(2)— 在test suite中运行test case
    postman教程(1)
    unix环境高级编程——文件和目录
    unix环境高级编程——文件IO
  • 原文地址:https://www.cnblogs.com/qigao/p/16304315.html
Copyright © 2020-2023  润新知