代码
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(); }