Semaphore 控制幷發數

本文介绍了一个使用 C# 实现的 Semaphore 示例,通过 Semaphore 控制多个线程的并发执行数量,防止资源过度竞争。示例中详细展示了如何初始化 Semaphore、创建线程、占用和释放 Semaphore 资源,以及如何在主线程中调用 Semaphore 的 WaitOne 和 Release 方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 參考 https://www.cnblogs.com/yifengjianbai/p/5468449.html

public partial class Semaphore1 : Form
    {

        private delegate void UpdateBox(object text);
        UpdateBox UpText;
        Semaphore Sema;
        public Semaphore1()
        {
            InitializeComponent();
        }

        private void Semaphore1_Load(object sender, EventArgs e)
        {
            UpText = new UpdateBox(upRichText);
        }

        private void btnStart_Click(object sender, EventArgs e)
        {
            int ThreadNum = int.Parse(this.ThreadNum.Text);
            int SemphoreNum = int.Parse(this.textBox1.Text);
            Start(ThreadNum, SemphoreNum);
        }

        public void Start(int ThreadNum,int SemphoreNum)
        {
            Sema = new Semaphore(SemphoreNum, SemphoreNum);//初始化個數,最大個數,初始化個數限制線程數量
            //Sema.WaitOne();
            for (int i = 0; i < ThreadNum; i++)
            {
                Thread m_SplashThread = new Thread(new ParameterizedThreadStart(delegate(object OBJ) {
                    Run(OBJ);
                })); 
                m_SplashThread.IsBackground = true; 
                m_SplashThread.SetApartmentState(ApartmentState.STA); 
                m_SplashThread.Start(i); //不要用new object[]這樣是個數組
            }
        }

        private void Run(object obj)
        {
            Sema.WaitOne();//佔用一個線程
            Bevoid("Start" + obj.ToString());
            Thread.Sleep(2000);
            Bevoid("End" + obj.ToString());
            Sema.Release();//釋放一個線程,釋放超過最大數時,報錯
        }

        private void Bevoid(object obj)
        {
            this.BeginInvoke(UpText, obj);
        }

        private void upRichText(object text)
        {
            if (this.richTextBox1.Lines.Length > 100)
            {
                this.richTextBox1.Text="";

            }
            this.richTextBox1.AppendText(text.ToString());
            this.richTextBox1.AppendText(Environment.NewLine);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Sema.Release();//釋放一個線程
        }

        private void button2_Click(object sender, EventArgs e)
        {
            Sema.WaitOne();//佔用一個線程,主線程會被阻塞
        }
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值