Пример #1
0
        static void Main(string[] args)
        {
            for (int i = 0; i < 20; i++)
            {
                if (i == 10)
                {
                    Thread.Sleep(10000);
                }

                OrderedThread orderedThread = new OrderedThread((o) =>
                {
                    Console.WriteLine("第一轮:当前的线程序号" + o);

                    Thread.Sleep(1000);

                    Console.WriteLine(DateTime.Now.ToString());
                });
                orderedThread.Start();
            }

            Console.WriteLine("第一轮全部开始了...");

            for (int i = 0; i < 20; i++)
            {
                OrderedThread orderedThread = new OrderedThread((o) =>
                {
                    Console.WriteLine("第二轮:当前的线程序号" + o);

                    Thread.Sleep(1000);

                    Console.WriteLine(DateTime.Now.ToString());
                });
                orderedThread.Start();
            }

            Console.WriteLine("第二轮全部开始了...");

            Console.ReadKey();
        }
Пример #2
0
        /// <summary>
        /// 开始执行线程
        /// </summary>
        public void Start(bool isBackgroundThread = true)
        {
            //添加到就绪集合中
            inner_readyThreadList.AddOrUpdate(_inner_orderedID++, this, (key, vlaue) =>
            {
                return(this);
            });

            Thread th = new Thread(() =>
            {
                bool isEnter = Monitor.TryEnter(_objLock);
                if (isEnter)
                {
                    //Console.WriteLine("新开一个线程--------------------------");

                    //如果就绪队列中有要执行的线程
                    while (inner_readyThreadList.Count() > 0)
                    {
                        //找到起始的最小值
                        int minIndex = inner_readyThreadList.Keys.Min();

                        //绪队列中线程执行
                        inner_readyThreadList[minIndex]._inner_action.Invoke(minIndex);

                        //移除执行完成的
                        OrderedThread orderedThreadTmp = null;
                        inner_readyThreadList.TryRemove(minIndex, out orderedThreadTmp);
                    }

                    Monitor.Exit(_objLock);
                }
            });

            th.SetApartmentState(ApartmentState.STA);
            th.IsBackground = isBackgroundThread;
            th.Start();
        }