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

C# 多线程交替按照指定顺序执行

1.关于AutoResetEvent和ManualResetEvent的区别解释如下:

AutoResetEvent和ManualResetEvent是.NET中的两个线程同步类。它们之间的主要区别在于其释放信号的方式以及对等待线程的影响。

AutoResetEvent的作用是在等待的线程被信号唤醒后,将信号自动重置为非终止状态。也就是说,当一个线程等待一个AutoResetEvent对象时,一旦它收到信号并被唤醒,AutoResetEvent对象会自动将自身状态重置为非终止状态,以便其他线程可以继续等待。这样,只有一个线程能够通过AutoResetEvent对象,其他线程需要重新等待信号。

而对于ManualResetEvent,一旦一个线程等待一个ManualResetEvent对象并收到信号唤醒后,ManualResetEvent对象不会自动重置为非终止状态。也就是说,ManualResetEvent对象会维持其终止状态,直到调用Reset()方法将其重置为非终止状态才能再次触发等待的线程。这意味着多个线程可以同时通过ManualResetEvent对象,并且不需要重新等待信号。

因此,AutoResetEvent和ManualResetEvent的主要区别在于对等待线程的影响。AutoResetEvent只允许一个线程通过,并且在线程收到信号后自动重置为非终止状态,而ManualResetEvent允许多个线程通过,并且在等待线程收到信号后,保持其终止状态直至调用Reset()方法将其重置为非终止状态。

总结:AutoResetEvent不需要Reset()方法(唤醒后自动调用),而ManualResetEvent需用用户手动触发。

多个线程按照顺序执行案例如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;namespace WindowsFormsApp2
{public partial class Form1 : Form{public Form1(){InitializeComponent();}AutoResetEvent A = new AutoResetEvent(false); //实例化阻塞事件AutoResetEvent B = new AutoResetEvent(false); //实例化阻塞事件AutoResetEvent C = new AutoResetEvent(false); //实例化阻塞事件private void button1_Click(object sender, EventArgs e){A.Set();Task.Run(() =>{AA();});Task.Run(() =>{BB();});Task.Run(() =>{CC();});}private void AA(){for (int i = 0; i < 10; i++){A.WaitOne();//等待信号Console.WriteLine("A");B.Set();}}private void BB(){for (int i = 0; i < 10; i++){B.WaitOne();Console.WriteLine("B");C.Set();}}private void CC(){for (int i = 0; i < 10; i++){C.WaitOne();Console.WriteLine("C");A.Set();}}}
}

执行结果:依次按照顺序输出abc。

 

http://www.lryc.cn/news/147534.html

相关文章:

  • 【VLDB 2023】基于预测的云资源弹性伸缩框架MagicScaler,实现“高QoS,低成本”双丰收
  • Node爬虫项目精简版 wallhaven网站实操 2023.8.29
  • Vue统计图表的数据标签和数值显示技巧
  • Linux 虚拟机同步时间crontab以及crond详解
  • springmvc没有绿标,怎么配置tomcat插件运行?
  • 设计模式--模板方法模式(Template Method Pattern)
  • linux 权限管理命令
  • c++ qt--线程(一)(第八部分)
  • 参数初始化方法
  • Go的基础运行方式和打包
  • Deepin 图形化部署 Hadoop Single Node Cluster
  • 23款奔驰GLS400升级柏林之声音响系统,体验不一样的感觉
  • Vue的map()方法和filter()方法的使用
  • qt创建临时文件
  • Element——table排序,上移下移功能。及按钮上一条下一条功能
  • 无涯教程-Android - Linear Layout函数
  • ELK安装、部署、调试(六) logstash的安装和配置
  • 【Spring Security】UserDetails 接口介绍
  • C# Linq源码分析之Take(四)
  • Python 和 C++ 使用细节差别
  • 在Ubuntu Linux系统上安装RabbitMQ服务并解决公网远程访问问题
  • 葫芦娃自动预约-公众号代挂
  • ESP32应用教程(0)— PMW3901MB光流传感器
  • docker部署nginx,部署springboot项目,并实现访问
  • 十五、模板方法模式
  • jvm 什么是常量池,常量池定义 class常量池
  • CA证书颁发机构服务器
  • 5. 线性层及其他层
  • PhpStorm安装篇
  • 麒麟Linux常见问题