コード
プライベート 無効 CreatThread(int型タイプ) { リスト < int型 > indexs = 新しいリスト< 整数 > (); この .Invoke(新しい MethodInvoker(デリゲート { 开始ToolStripMenuItem.Enabled = 偽; 从选中执行ToolStripMenuItem.Enabled = 偽; 只执行选中ToolStripMenuItem.Enabled = 偽; buttonItem_Start.Enabled = 偽。 SysVar.VcodeType = comboBoxEx_vcodeType.SelectedIndex。 スイッチ(タイプ) { ケース 0 : のために(int型 i = 0 ; I <dataGridViewX1.Rows.Count; iは++ ) { indexs.Add(i)を、 } ブレーク; ケース 1 : int型 selectNow = dataGridViewX1.CurrentCell.RowIndex。 以下のための(int型私は=0 ; 私はdataGridViewX1.Rows.Count < - selectNowを。私は++ ) { indexs.Addは、式(I + )selectNow。 } ブレーク; ケース 2 : のために(int型 i = 0 ; I <dataGridViewX1.SelectedRows.Count; I ++ ) { indexs.Add(dataGridViewX1.SelectedRows [I] .INDEX)。 } ブレーク; デフォルト: 休憩; } }))。 // 等待变量 int型 stopNum = 0 ; int型 adslNum = 0 ; 一覧 <スレッド> THS = 新しいリスト<スレッド> (); j_semaphore = 新しいセマフォ(Convert.ToInt32(integerInput_ThreadNum.Value)、Convert.ToInt32(integerInput_ThreadNum.Value)、" MySemaphore " ); 以下のために(int型 i = 0 ; I <indexs.Count; iは++ ) { 場合(SysVar.manualResetEvent.WaitOne(0)== 真) { ブレーク。 } j_semaphore.WaitOne()。 int型 J = indexs [i]は、 スレッド番目 = 新しいスレッド(新しい ThreadStart(デリゲート { WorkSemaphore(J); }))。 th.IsBackground = 真; th.Start(); ths.Add(TH)。 もし(Convert.ToInt32(integerInput_AdslNum.Value)> 0 ) { adslNum + = Convert.ToInt32(integerInput_StopNum.Value))1 ; もし(adslNum> = Convert.ToInt32(integerInput_AdslNum.Value)) { WaitAll(REFのTHS)。 AdslDB(); adslNum = 0 ; } } もし(Convert.ToInt32(integerInput_StopNum.Value)> 0 ) { stopNum + = 1 ; もし(stopNum> = { WaitAll(REFTHS); 用(INT N = 0、N <Convert.ToInt32(integerInput_StopTime.Value); N ++ ) { スレッドTは = 新しいスレッド(O =>のThread.sleep(1000 ))。 t.Start(この); 一方、(t.IsAlive) { Application.DoEvents(); } } stopNum = 0 。 } } } WaitAll(REFのTHS)。 j_semaphore.Close(); この .Invoke(新しいイベントハンドラ(デリゲート { 开始ToolStripMenuItem.Enabled = 真; 从选中执行ToolStripMenuItem.Enabled = 真、 只执行选中ToolStripMenuItem.Enabled = 真; buttonItem_Start.Enabled = 真; }))。 } プライベート 無効 WaitAll(REF一覧<スレッド> THS) { // 投递完毕、等待线程完成! 以下のために(int型 i = 0 ; I <ths.Count; iは++ ) { 一方(THS [I] .ThreadState =!System.Threading.ThreadState.Stopped) { Application.DoEvents(); } } ths.Clear()。 }