当前位置: 首页 > news >正文

c# 多线程编程中AutoResetEvent和ManualResetEvent

作为等同于Java的wait,notify,notifyAll的存在,AutoResetEvent和ManualResetEvent分别实现了notify和notifyAll的功能,下面的代码简单讲解了一下实现原理,并展示了这一过程。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace ThreadTest
{
    class Program
    {
        //新建一个默认无信号的手动重置线程事件
        private void Test()
        {
            ManualResetEvent manualResetEvent = new ManualResetEvent(false);
            AutoResetEvent autoResetEvent = new AutoResetEvent(false);
            //线程传参需要通过ParameterizedThreadStart委托,并在Start时附加参数。
            new Thread(new ParameterizedThreadStart(MyThreadHandler)).Start(new ParamStruct("Thread1", manualResetEvent));
            new Thread(new ParameterizedThreadStart(MyThreadHandler)).Start(new ParamStruct("Thread2", manualResetEvent));
            new Thread(new ParameterizedThreadStart(MyThreadHandler)).Start(new ParamStruct("Thread3", autoResetEvent));
            new Thread(new ParameterizedThreadStart(MyThreadHandler)).Start(new ParamStruct("Thread4", autoResetEvent));
            Thread.Sleep(1000);
            //manualResetEvent在Set方法中,会让信号状态从无到有,从而让所有wait状态的线程唤醒,实现NotifyAll
            manualResetEvent.Set();
            //autoResetEvent在Set方法中,会在第一个处于wait状态的线程唤醒后将信号状态Reset,变为无信号,实现NotifyOne
            autoResetEvent.Set();
            Thread.Sleep(1000);
            autoResetEvent.Set();
            Console.ReadKey();
        }
        static void Main(string[] args)
        {
            new Program().Test();
        }
        private void MyThreadHandler(object obj)
        {
            if (obj is ParamStruct paramStruct)
            {
                Console.WriteLine(paramStruct.threadName);
                paramStruct.resetEvent.WaitOne();
                Console.WriteLine(paramStruct.threadName + " finished on " + DateTime.Now);
            }
        }
    }
    class ParamStruct
    {
        public string threadName;
        public EventWaitHandle resetEvent;
        public ParamStruct(string threadName, EventWaitHandle resetEvent)
        {
            this.threadName = threadName;
            this.resetEvent = resetEvent;
        }
    }
}

转载于:https://www.cnblogs.com/cielosun/p/7300369.html

相关文章:

  • 【Python】 配置文件相对路径软件自动执行的工作目录
  • [SDUT](3361) 数据结构实验之图论四:迷宫探索 ---DFS(图)
  • proxy汇总-1
  • 使用for循环输出九九乘法表
  • ffmpeg学习(二) 通过rtsp获取H264裸流并保存到mp4文件
  • 安装node.js和npm
  • 推荐几款谷歌浏览器的使用插件
  • webservcie学习之webservice是什么
  • Win10《芒果TV》更新v3.6.0秋收版:新增追剧磁贴、记忆续播、跳转列表
  • Centos7安装TensorFlow
  • 没有绝对的cc.ResolutionPolicy.FIXED_WIDTH或cc.ResolutionPolicy.FIXED_HEIGHT
  • Spring 定时任务之 @Scheduled cron表达式
  • Java内存知识整理
  • 嵌入式GPIO接口及操作(一)
  • Redis源代码剖析--对象object
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • Android Studio:GIT提交项目到远程仓库
  • go语言学习初探(一)
  • HTTP请求重发
  • in typeof instanceof ===这些运算符有什么作用
  • JavaScript设计模式系列一:工厂模式
  • JavaScript中的对象个人分享
  • Nacos系列:Nacos的Java SDK使用
  • PAT A1050
  • python学习笔记 - ThreadLocal
  • Spark RDD学习: aggregate函数
  • Vue2.x学习三:事件处理生命周期钩子
  • 分布式任务队列Celery
  • 复杂数据处理
  • 观察者模式实现非直接耦合
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 微服务核心架构梳理
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • ionic入门之数据绑定显示-1
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • ​如何防止网络攻击?
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (算法设计与分析)第一章算法概述-习题
  • (转)EXC_BREAKPOINT僵尸错误
  • (转)Unity3DUnity3D在android下调试
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .NET 常见的偏门问题
  • .net 提取注释生成API文档 帮助文档
  • .net访问oracle数据库性能问题
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • .NET下的多线程编程—1-线程机制概述
  • @RequestMapping 的作用是什么?
  • [ Linux 长征路第二篇] 基本指令head,tail,date,cal,find,grep,zip,tar,bc,unname