C#多线程阻塞ManualResetEvent实例,多线程等待另一个线程信号后再运行,多线程阻塞ManualResetEvent的实际教程 多线程阻塞最简单教程 一看就会的线程阻塞的demo

 

  上图的所有多线程案例大全完整版本项目源代码下载---->点击下载

 

 在讨论多线程阻塞的优点之前,我们需要明确什么是多线程阻塞。在多线程编程中,阻塞是一种机制,它允许一个线程在某些条件未满足之前暂停执行,直到这些条件满足后才继续执行。C# 提供了多种同步原语来实现线程阻塞

优点

  1. 简化同步逻辑:阻塞机制能够简化多线程之间的同步逻辑。当一个线程需要等待某个条件满足(如资源可用、任务完成或其他线程的信号)时,直接阻塞等待而非采用复杂的轮询或忙等待,可以减少代码复杂度,提高可维护性。

  2. 节省系统资源:相较于忙等待(即不断检查条件是否满足),阻塞线程会释放CPU资源,让给其他线程或进程使用,从而提升系统整体效率。当线程处于阻塞状态时,操作系统可以调度其他任务运行,避免不必要的CPU占用。

  3. 增强可靠性:阻塞同步机制有助于避免竞态条件和死锁,因为线程在关键资源不可用时会安全地等待,而不是试图强制访问,减少了数据不一致的风险。

  4. 提高响应性:在UI线程或服务端处理请求时,合理使用阻塞可以确保主线程不会被长时间占用,从而保持界面的流畅性或快速响应客户端请求。

业务应用场景

  1. 生产者-消费者模式:在这种模式下,生产者线程生成数据,消费者线程处理数据。使用阻塞机制可以确保生产者在消费者准备好之前不会生成数据,消费者也不会在没有数据时进行处理。

  2. 数据库访问:在需要对数据库进行并发访问的应用程序中,阻塞机制可以用来同步对数据库的访问,以避免数据冲突和保持数据的一致性。

  3. I/O操作:在执行文件读写或其他I/O操作时,阻塞可以确保数据完全写入或读取后再进行后续操作,防止数据损坏。

  4. 信号处理:在需要等待外部信号(如用户输入、网络消息等)的应用程序中,阻塞可以确保程序在接收到信号后再继续执行。

  5. 任务调度:在需要按照特定顺序执行多个任务的场景中,阻塞可以用来控制任务的执行顺序,确保任务按正确的顺序完成。

  6. 资源共享:在多个线程需要访问共享资源(如内存、文件句柄等)时,阻塞可以确保资源在被一个线程使用时,其他线程不会进行访问。

  7. 超时控制:在需要对操作设置超时的场合,可以使用阻塞机制来实现超时控制,例如,当一个网络请求超过预定时间没有响应时,可以通过阻塞机制来终止等待。

static ManualResetEvent manualEvent = new ManualResetEvent(false);

        private async void button25_Click(object sender, EventArgs e)
        {
            List<Task> taskList = new List<Task>();
            taskList.Add(
                Task.Run(() => {
                    ThreadWork();
                })
                );
            taskList.Add(
                Task.Run(() => {
                     ThreadWork();
                })
                );
           
            Console.WriteLine("主线程等待一段时间后发送信号...");
            Thread.Sleep(2000);
            manualEvent.Set(); // 发送信号

            Console.WriteLine("主线程继续执行其他任务...");

            // 等待所有任务完成并获取结果
            await Task.WhenAll(taskList);

            Console.WriteLine("所有线程完成,程序结束。");
        }

        private void ThreadWork()
        {
            Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId} 开始等待信号...");
            manualEvent.WaitOne(); // 等待信号
            Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId} 收到信号,继续执行...");
            Thread.Sleep(500);
        }

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值