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();