• 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();
            }
  • 相关阅读:
    Ubuntu下基于u-boot搭建qemu的vexpress环境
    linux从head.s到start_kernelstart_kernel之---内核重定位后分析
    linux从head.s到start_kernelstart_kernel之---内核解压到重定位分析
    Jupyter Notebook介绍、安装及使用教程
    python基于SMTP发送邮件(qq邮箱)
    python正则表达式多次提取数据(一个规则提取多组数据)
    python正则表达式提取中文
    找到任务栏图标广告的源头
    1. Visio Web 形状
    Python GUI之tkinter窗口视窗教程大集合(看这篇就够了)
  • 原文地址:https://www.cnblogs.com/wangyinlon/p/11543436.html
Copyright © 2020-2023  润新知