c#信号量实现线程挂起,暂停,继续,停止操作
c#信号量实现线程挂起,暂停,继续,停止操作
using System; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace testManualResetEvent { public partial class Form1 : Form { ManualResetEvent manualResetEvent = new ManualResetEvent(false);//初始信号量状态false,线程启动后为阻塞状态 CancellationTokenSource cts = new CancellationTokenSource();//终止线程 Task task; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { task = new Task(run, cts.Token); task.Start(); } bool flagwait = false; private void run() { int i = 0; while (true) { if (flagwait) { #region /* * WaiOne函数会暂停当前线程 * 继续条件有两个: * 1、参数1指定的时间到了,如:5000ms(此时忽略信号量状态) * 2、信号量变为置位状态。 * * 如果调用WaiOne的无参函数,则无限等待,继续条件为: * 信号量变为置位状态。 */ #endregion manualResetEvent.Reset();//先复位信号量(信号量置位情况下,未复位无法阻塞线程) bool flag = manualResetEvent.WaitOne(1000, false);//不指定时间则无限暂停 flagwait = false; } manualResetEvent.WaitOne();//不指定时间则无限暂停 this.Invoke(new Action<string>((s) => { label1.Text = s; }), i++.ToString()); #region 线程终止CancellationTokenSource if (cts.Token.IsCancellationRequested) { Console.WriteLine("线程被终止!"); break; } #endregion Thread.Sleep(1); } } private void button_阻塞线程_Click(object sender, EventArgs e) { flagwait = true; } private void button_信号量置位_Click(object sender, EventArgs e) { manualResetEvent.Set(); } private void button_信号量复位_Click(object sender, EventArgs e) { manualResetEvent.Reset(); } private void button_CancellationTokenSource终止线程_Click(object sender, EventArgs e) { cts.Token.ThrowIfCancellationRequested(); cts.Cancel(); } } }
欢迎讨论,相互学习。
cdtxw@foxmail.com
分类:
C#
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)