C#常用多线程(线程同步,事件触发,信号量,互斥锁,共享内存,消息队列)

复制代码

using System;
using System.Threading;
using System.Windows.Forms;
using UtilForm.Util;namespace UtilForm
{// 线程同步,事件触发,信号量,互斥锁,共享内存,消息队列public partial class frmUIThread : Form{ SynchronizationContext context;// 子线程同步到主线程 public delegate void DoSth(object sender); // 事件触发public event DoSth OnMyEvent;Mutex mutex = new Mutex(); // 互斥锁,锁住某一资源 ManualResetEvent manualReset = new ManualResetEvent(false); // 信号量,流程上锁定,A执行完再执行B  public frmUIThread(){InitializeComponent();}private void MainForm_Load(object sender, EventArgs e){ context = SynchronizationContext.Current; OnMyEvent += new DoSth(ProgressEvent);Console.WriteLine("主线程id:" + Thread.CurrentThread.ManagedThreadId);// 线程同步ThreadPool.QueueUserWorkItem(state =>{Console.WriteLine("子线程id:" + Thread.CurrentThread.ManagedThreadId);for (int i = 0; i < 3; ++i){//textBox1.Text = i.ToString();//:“线程间操作无效: 从不是创建控件“textBox1”的线程访问它。”//// 写法1://textBox1.BeginInvoke((MethodInvoker)delegate//{//    textBox1.Text = i.ToString();//});////// 写法2:context.Send(ProgressUI, i);if (2 == i){OnMyEvent(i);// 线程间回调}Thread.Sleep(100);}});// 模拟互斥量ThreadPool.QueueUserWorkItem(new WaitCallback(ThdMutex));ThreadPool.QueueUserWorkItem(new WaitCallback(ThdMutex));// 模拟信号量在B流程中阻塞,A流程结束,继续B流程ThreadPool.QueueUserWorkItem(state =>{Console.WriteLine("模拟信号量,A开始执行");Thread.Sleep(5000);manualReset.Set();// 释放Console.WriteLine("模拟信号量,A执行完成");});ThreadPool.QueueUserWorkItem(state =>{Console.WriteLine("模拟信号量,B等待执行");manualReset.Reset();// 重置信号量 manualReset.WaitOne();// 停止//manualReset.WaitOne(2000);// 带超时停止Console.WriteLine("模拟信号量,B执行完成");}); // 共享内存 ThreadPool.QueueUserWorkItem(state =>{MemoryCacheHelper.SetCache("10001", "123");});ThreadPool.QueueUserWorkItem(state =>{Thread.Sleep(5000);var val = MemoryCacheHelper.GetCache("10001");Console.WriteLine($"共享内存:{val}");});}/// <summary>/// 更新UI/// </summary>/// <param name="obj"></param>private void ProgressUI(object obj){Console.WriteLine("更新UI线程::当前线程id:" + Thread.CurrentThread.ManagedThreadId);textBox1.Text = obj.ToString();}/// <summary>/// 事件处理/// </summary>private void ProgressEvent(object sender){Console.WriteLine($"线程事件触发:{sender.ToString()}");}void ThdMutex(object obj){mutex.WaitOne();Console.WriteLine($"互斥线程 {Thread.CurrentThread.ManagedThreadId} 正在执行任务");Thread.Sleep(1000);Console.WriteLine($"互斥线程 {Thread.CurrentThread.ManagedThreadId} 任务执行完毕");mutex.ReleaseMutex(); }}
}

复制代码

复制代码

using System;
using System.Runtime.Caching;namespace UtilForm.Util
{public class MemoryCacheHelper{private static MemoryCache cache = MemoryCache.Default;// MemoryCache ObjectCache/// <summary>/// 读取缓存/// </summary>/// <param name="key"></param>/// <returns></returns>public static object GetCache(string key){var obj = cache.Get(key);//Console.WriteLine($"-读取缓存[{key}]:{JsonConvert.SerializeObject(obj, Formatting.Indented)}");return obj;}/// <summary>/// 写入缓存/// </summary>/// <param name="key"></param>/// <param name="obj"></param>/// <param name="timeout">过期时间,默认7200秒</param>public static void SetCache(string key, object obj, int timeout = 7200){cache.Set(key, obj, DateTimeOffset.Now.AddSeconds(timeout));//Console.WriteLine($"-写入缓存[{key}]:{JsonConvert.SerializeObject(obj, Formatting.Indented)}");}/// <summary>/// 删除缓存/// </summary>/// <param name="key"></param>public static void RemoveCache(string key){cache.Remove(key);//Console.WriteLine($"-移除缓存[{key}]");}}
}

复制代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/69440.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【RapidAI】P1 中文文本切割程序

中文文本切割程序 基本信息代码解析相关包获取 yaml 关键文件类的构造函数切分语句部分特殊处理 PDF重点切分去除数组中空字符串再度切分后长度 附录附录一&#xff1a;完整代码附录二&#xff1a;可继续思考问题 基本信息 文件名&#xff1a; chinese_text_splitter.py 文件地…

Linux查看内存大小、CPU版本

查看cpu 第一种方法&#xff1a;top命令法 1、首先执行top命令&#xff1b; 2、在top命令的显示界面&#xff0c;按数据键1&#xff0c;即可查看到当前系统中的总cpu数&#xff1b; 第二种方法&#xff1a;通过proc文件系统&#xff0c;直接获取cpu总数量&#xff0c;具体执行…

autojs修改顶部标题栏颜色

顶部标题栏的名字是statusBarColor 不是toolbar。难怪我搜索半天搜不到 修改之后变成这样了 代码如下&#xff1a; "ui"; importClass(android.view.View); importClass(android.graphics.Color); ui.statusBarColor(Color.parseColor("#ffffff")); ui.…

一个月能做什么?成长感悟分享

一个月做了什么&#xff1f; 八月做了些什么&#xff1f; 单词打卡 第一件事情就是单词打卡 英语很差的我&#xff0c;一样继续打卡&#xff0c;今天是第736天 当你还在纠结扇贝和不背、可可英语哪一个好的时候&#xff0c;别人已经同时使用了 当你还在咨询学编程、敲代码需…

Pygame中Trivia游戏解析6-1

1 Trivia游戏简介 Trivia的含义是“智力测验比赛中的各种知识”。Trivia游戏类似智力竞赛&#xff0c;由电脑出题&#xff0c;玩家进行作答&#xff0c;之后电脑对玩家的答案进行判断&#xff0c;给出结果并进行评分。该游戏的界面如图1所示。 图1 Trivia游戏界面 2 游戏流程 …

MATLAB算法实战应用案例精讲-【数模应用】特征工程

目录 前言 几个高频面试题目 特征值的范围是什么? 特征转换方法有哪些?

git 后悔药

前言 自上而下&#xff0c;撤销可以分为从远程库撤销&#xff0c;从本地库撤销&#xff0c;从暂存库撤销。 例子&#xff1a;代码已经提交了三个记录到远程库&#xff0c;分别对应了记录1&#xff0c;内容1&#xff0c;记录2&#xff0c;内容2&#xff0c;记录3&#xff0c;内…

QTday5(QT连接TCP通信)

一、Xmind整理&#xff1a; C语言中的通信协议&#xff1a; 二、上课笔记整理&#xff1a; 1.QT中的服务器端的操作&#xff1a; .pro文件&#xff1a; 头文件&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> //服务…

npm install依赖冲突解决办法

今天npm的时候发现报错&#xff0c;原来是依赖冲突了 npm后面加上这个指令就可以顺利的安装依赖了。问题主因就是不同开发用了不同版本node导致依赖版本不同&#xff0c;出现了成功冲突&#xff0c;这是段指令&#xff1b;它告诉npm忽略项目中引入的各个依赖模块之间依赖相同但…

和AI聊天:动态规划

动态规划 动态规划&#xff08;Dynamic Programming&#xff0c;简称 DP&#xff09;是一种常用于优化问题的算法。它解决的问题通常具有重叠子问题和最优子结构性质&#xff0c;可以通过将问题分解成相互依赖的子问题来求解整个问题的最优解。 动态规划算法主要分为以下几个步…

Java数组(未完待续)

诸神缄默不语-个人CSDN博文目录 我写Java的一天&#xff0c;是复健的一天。 很难想象我本科考96分的一门课&#xff0c;在区区5年之后&#xff0c;我就忘得这么彻彻底底。 数组Array&#xff1a;用来存储固定大小的同类型元素 文章目录 1. 创建数组2. 数组转字符串其他本文撰…

layui 新增tab标签页

// $("#fjyj").click(function () {// //window.location.href "/sysconfig/SuperVisorEdit";// navigateToTeamPersonModule(/CollectData/GradeWarning/EduIndex, 分级预警);// });function navigateToTeamPersonModule(url, name) {var ids n…

如何截取视频中的一段视频?分享几种视频分割方法

当处理长视频时&#xff0c;视频分割可以使您更加高效。如果您只需要处理其中的一部分&#xff0c;而不是整个视频&#xff0c;那么分割视频可以使您更容易找到需要处理的部分。而且&#xff0c;分割视频还可以使您更容易在不同的项目之间重复使用视频片段。教大家几种简单的视…

基于blockqueue的生产和消费模型

线程篇下讲的是基于阻塞队列的生产者消费者模型。在学习这个之前我们先了解一些其他概念&#xff1a; 同步&#xff1a;在保证数据安全的条件下&#xff0c;让线程按某种特定的顺序依次访问临界资源。 通过上一节的代码我们实现了一个多线程抢票的程序&#xff0c;但结果显示…

分布式锁之redis实现

docker安装redis 拉取镜像 docker pull redis:6.2.6 查看镜像 启动容器并挂载目录 需要挂在的data和redis.conf自行创建即可 docker run --restart always -d -v /usr/local/docker/redis/redis.conf:/usr/local/etc/redis/redis.conf -v /usr/local/docker/redis/data:/dat…

运算符与逻辑分支

2.运算符与逻辑分支 持续更新中… 运算符 1.进制转换 .toString() 10进制转换为其他进制 parseInt() 其他进制转换为10进制 进制: 二进制: 0, 1 (0~1) 八进制: 0, 1, 2, 3, 4, 5, 6, 7 (0~7) 十进制: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 (0~9) 十六进制: 0, 1, 2, 3, 4, 5, 6,…

使用 【jacoco】对基于 SpringBoot 和 Dubbo RPC 的项目生成测试覆盖率报告:实践+原理

基于 Dubbo RPC 的项目中有一个提供者项目backend、一个消费者项目gateway、以及注册中心nacos。本篇文章记录在windows本地对该框架的测试过程&#xff0c;以及介绍jacoco的基本原理 测试过程 官网下载安装包解压到本地&#xff0c;https://www.jacoco.org/jacoco/ 只需要用…

Android键盘监听

拦截键盘可在Activity中重写onKeyDown方法 常用的KeyCode有 KEYCODE_ALL_APPS 多任务管理键 KEYCODE_HOME Home键 KEYCODE_BACK 返回键 KEYCODE_POWER 电源键 KEYCODE_VOLUME_UP 加音量键 KEYCODE_VOLUME_DOWN 减音量键还有相机键、菜单键、查找键、&#xff08;上&…

11. Junit

我们主要学习的是 Junit5. 1. selenium 和 Junit 之间的关系 selenium 和 Junit 之间的关系 就像 Java 和 JavaScript 之间的关系&#xff0c;也就是没有关系。 为什么学习了 selenium 还要学习 Junit 呢&#xff1f; 举个例子&#xff0c;如果 Selenium 编写的自动化测试用…

论坛系统公共组件部分

1.在Java⽬录下创建包&#xff0c;在Resources⽬录下创建⽂件夹&#xff0c;结构如下 ├─java # java⽂件区 │ └─com │ └─example │ └─demo │ ├─common # 公共类 │ ├─config # 配置…