驾驭C#多线程的魔法棒:掌握启动、暂停、继续、关闭线程

本文介绍了如何在WindowsForms应用程序中使用ManualResetEvent和CancellationTokenSource进行线程间的同步和取消操作,包括创建事件、管理CancellationToken以及处理线程间的通信和取消任务。
摘要由CSDN通过智能技术生成
 // 定义一个ManualResetEvent实例m,用于跨线程的信号传递  
 ManualResetEvent manualResetEvent;
 // 定义一个CancellationTokenSource实例TokenSource,用于创建和管理CancellationToken  
 CancellationTokenSource TokenSource;
 // 定义一个CancellationToken实例CancellationToken,它用于通知任务应该取消  
 CancellationToken CancellationToken;
 public Form1()
 {
     InitializeComponent();
     CheckForIllegalCrossThreadCalls = false;// 禁用对非法跨线程调用的检查
 }
   private void button1_Click(object sender, EventArgs e)
  {
      // 创建一个新的CancellationTokenSource实例  
      TokenSource = new CancellationTokenSource();
      // 从TokenSource中获取CancellationToken  
      CancellationToken cancellationToken = TokenSource.Token;
      // 创建一个新的ManualResetEvent实例,并初始化为已信号状态(即允许等待的线程继续执行)  
      manualResetEvent = new ManualResetEvent(true);
      // 使用Task.Factory启动一个新的任务,并传入一个lambda表达式作为任务的入口点  
    
      new System.Threading.Thread(() =>
      {
          for (int i = 0; i < 1000; i++)
          {
              // 检查是否请求了取消  
              if (cancellationToken.IsCancellationRequested)
              {
                  // 如果请求了取消,则退出循环并结束任务  
                  return;
              }
              // 等待m变为已信号状态  
              manualResetEvent.WaitOne();
              // 在此处尝试更新textBox1的Text属性(但这是一个线程不安全的操作)  
              // 使用Control.Invoke来在UI线程上安全地更新UI元素  
              if (textBox1.InvokeRequired)
              {
                  textBox1.Invoke((MethodInvoker)delegate {
                      textBox1.Text = i.ToString();
                  });
              }
              else
              {
                  // 仅在textBox1已经在当前线程(这通常不会发生)时直接更新  
                  textBox1.Text = i.ToString();
              }
              // 线程休眠500毫秒  
              System.Threading.Thread.Sleep(50);
          }
      }).Start(); // 传入cancellationToken以便在需要时取消任务  
  }

  private void button2_Click(object sender, EventArgs e)
  {
      // 将m重置为非信号状态,这会导致任何正在等待m的线程被阻塞 
      manualResetEvent.Reset();
  }

  private void button3_Click(object sender, EventArgs e)
  {
      // 将m设置为已信号状态,允许任何正在等待m的线程继续执行 
      manualResetEvent.Set();
  }

  private void button4_Click(object sender, EventArgs e)
  {
      // 请求取消由TokenSource管理的所有任务  
      TokenSource.Cancel();
      //TokenSource.CancelAfter(1000);延迟关闭
      textBox1.Text = "";
  }

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lucky.帅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值