C#マルチスレッドセマフォマニュアル

コード

    プライベート 無効 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()。
        }

 

おすすめ

転載: www.cnblogs.com/wangyinlon/p/11543436.html