C#上位机序列1: 多线程(线程同步,事件触发,信号量,互斥锁,共享内存,消息队列)
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}]"); } } }
qq:505645074
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了