c#信号量手动多线程

代码

    private void CreatThread(int type)
        {

            List<int> indexs = new List<int>();
            this.Invoke(new MethodInvoker(delegate
            {
                开始ToolStripMenuItem.Enabled = false;
                从选中执行ToolStripMenuItem.Enabled = false;
                只执行选中ToolStripMenuItem.Enabled = false;
                buttonItem_Start.Enabled = false;
                SysVar.VcodeType = comboBoxEx_vcodeType.SelectedIndex;
                switch (type)
                {
                    case 0:
                        for (int i = 0; i < dataGridViewX1.Rows.Count; i++)
                        {
                            indexs.Add(i);
                        }
                        break;
                    case 1:
                        int selectNow = dataGridViewX1.CurrentCell.RowIndex;
                        for (int i = 0; i < dataGridViewX1.Rows.Count - selectNow; i++)
                        {
                            indexs.Add(i + selectNow);
                        }
                        break;
                    case 2:
                        for (int i = 0; i < dataGridViewX1.SelectedRows.Count; i++)
                        {
                            indexs.Add(dataGridViewX1.SelectedRows[i].Index);
                        }
                        break;
                    default:
                        break;
                }
            }));
            //等待变量
            int stopNum = 0;
            int adslNum = 0;

            List<Thread> ths = new List<Thread>();
            j_semaphore = new Semaphore(Convert.ToInt32(integerInput_ThreadNum.Value), Convert.ToInt32(integerInput_ThreadNum.Value), "MySemaphore");
            for (int i = 0; i < indexs.Count; i++)
            {

                if (SysVar.manualResetEvent.WaitOne(0) == true)
                {
                    break;
                }
                j_semaphore.WaitOne();
                int j = indexs[i];
                Thread th = new Thread(new ThreadStart(delegate
                {
                    WorkSemaphore(j);
                }));
                th.IsBackground = true;
                th.Start();
                ths.Add(th);
                if (Convert.ToInt32(integerInput_AdslNum.Value) > 0)
                {
                    adslNum += 1;
                    if (adslNum >= Convert.ToInt32(integerInput_AdslNum.Value))
                    {
                        WaitAll(ref ths);
                        AdslDB();
                        adslNum = 0;
                    }

                }
                if (Convert.ToInt32(integerInput_StopNum.Value) > 0)
                {
                    stopNum += 1;
                    if (stopNum >= Convert.ToInt32(integerInput_StopNum.Value))
                    {
                        WaitAll(ref ths);
                        for (int n = 0; n < Convert.ToInt32(integerInput_StopTime.Value); n++)
                        {
                            Thread t = new Thread(o => Thread.Sleep(1000));
                            t.Start(this);
                            while (t.IsAlive)
                            {
                                Application.DoEvents();
                            }
                        }
                        stopNum = 0;
                    }

                }
            }
            WaitAll(ref ths);
            j_semaphore.Close();
            this.Invoke(new EventHandler(delegate
            {
                开始ToolStripMenuItem.Enabled = true;
                从选中执行ToolStripMenuItem.Enabled = true;
                只执行选中ToolStripMenuItem.Enabled = true;
                buttonItem_Start.Enabled = true;
            }));

        }
        private void WaitAll(ref List<Thread> ths)
        {
            //投递完毕,等待线程完成!
            for (int i = 0; i < ths.Count; i++)
            {
                while (ths[i].ThreadState != System.Threading.ThreadState.Stopped)
                {
                    Application.DoEvents();
                }
            }
            ths.Clear();
        }

猜你喜欢

转载自www.cnblogs.com/wangyinlon/p/11543436.html