当前位置: 首页 > news >正文

C# Winform 入门(14)之如何使用线程池

什么是线程?

首先我们要弄明白什么是线程,线程和线程池有啥区别?

C# 多线程应用(同步异步)_c# 异步线程-CSDN博客

 补充:ManualResetEvent 的使用

ManualResetEvent 是一种线程同步机制,用于控制一个或者多个线程的执行。它允许一个线程发出信号,通知其他等待的线程继续执行。ManualResetEvent 的初始状态可以是有信号(true)或无信号(false),通过调用 Set() 和Reset() 方法来改变其状态

基本用法

ManualResetEvent 的基本用法

  1. 创建 ManualResetEvent 实例    ManualResetEvent  mre = new ManualResetEvent(false);
  2. 线程等到信号:  mre.WaitOne();   //  阻塞当前线程,直到收到信号
  3. 发出信号: mre.Set();    // 发出信号,所有等待的线程将继续执行
  4. 重置信号:mre.Reset();   //将状态重置为无信号,阻塞后续调用WaitOne 的线程 

 控件

  • Proccceed 的功能是发出信号
  • reset 的功能是重置信号   

 展示效果

 实例化 ManualResetEvent

 //因为有4个线程,所以实例化四个
 static ManualResetEvent manual=new ManualResetEvent(true);
 static ManualResetEvent manual2=new ManualResetEvent(true);
 static ManualResetEvent manual3=new ManualResetEvent(true);
 static ManualResetEvent manual4=new ManualResetEvent(true);

 递进增添1

  private void addNum(object obj)
  {
      while (true)
      {
          object[]obb=(object[])obj;
          TextBox tb = (TextBox)obb[0];
          //每次添加1
          tb.Text=(Convert.ToInt16(tb.Text)+1).ToString();
          ManualResetEvent mre = (ManualResetEvent)obb[1];
          //防止线程阻塞
          mre.WaitOne();
          Thread.Sleep(1000);
      }
  }

调用线程池、总功能实现

 private void btn_all_Click(object sender, EventArgs e)
 {
     //创建了两个元素的数组
     //第一个是textBox
     //第二个是manual
     object[] ob1 = new object[2] { textBox1, manual };
     object[] ob2 = new object[2] {textBox2,manual2};
     object[] ob3 = new object[2] {textBox3,manual3};
     object[] ob4 = new object[2] {textBox4,manual4 };
     ThreadPool.QueueUserWorkItem(addNum, ob1);
     ThreadPool.QueueUserWorkItem(addNum, ob2);
     ThreadPool.QueueUserWorkItem(addNum, ob3);
     ThreadPool.QueueUserWorkItem(addNum, ob4);
 }

声明方法

private void operate(ManualResetEvent s)
{
    s.Set();
}
private void Stop(ManualResetEvent v)
{
    v.Reset();
}

发出信号功能

 private void btn_pro1_Click(object sender, EventArgs e)
 {
     operate(manual);
 }
 private void btn_pro2_Click(object sender, EventArgs e)
 {
     operate(manual2);
 }

 private void btn_pro3_Click(object sender, EventArgs e)
 {
     operate(manual3);
 }

 private void btn_pro4_Click(object sender, EventArgs e)
 {
     operate(manual4);
 }

重置信号功能

 private void btn_stop1_Click(object sender, EventArgs e)
 {
     Stop(manual);
 }

 private void btn_stop2_Click(object sender, EventArgs e)
 {
     Stop(manual2);
 }

 private void btn_stop3_Click(object sender, EventArgs e)
 {
     Stop(manual3);
 }

 private void btn_stop4_Click(object sender, EventArgs e)
 {
     Stop(manual4);
 }

线程总代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace _15.Using_ThreadPool
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            CheckForIllegalCrossThreadCalls=false;
        }
        //因为有4个线程,所以实例化四个
        static ManualResetEvent manual=new ManualResetEvent(true);
        static ManualResetEvent manual2=new ManualResetEvent(true);
        static ManualResetEvent manual3=new ManualResetEvent(true);
        static ManualResetEvent manual4=new ManualResetEvent(true);
        private void btn_all_Click(object sender, EventArgs e)
        {
            //创建了两个元素的数组
            //第一个是textBox
            //第二个是manual
            object[] ob1 = new object[2] { textBox1, manual };
            object[] ob2 = new object[2] {textBox2,manual2};
            object[] ob3 = new object[2] {textBox3,manual3};
            object[] ob4 = new object[2] {textBox4,manual4 };
            ThreadPool.QueueUserWorkItem(addNum, ob1);
            ThreadPool.QueueUserWorkItem(addNum, ob2);
            ThreadPool.QueueUserWorkItem(addNum, ob3);
            ThreadPool.QueueUserWorkItem(addNum, ob4);
        }
        private void addNum(object obj)
        {
            while (true)
            {
                object[]obb=(object[])obj;
                TextBox tb = (TextBox)obb[0];
                tb.Text=(Convert.ToInt16(tb.Text)+1).ToString();
                ManualResetEvent mre = (ManualResetEvent)obb[1];
                mre.WaitOne();
                Thread.Sleep(1000);
            }
        }
        private void operate(ManualResetEvent s)
        {
            s.Set();
        }
        private void Stop(ManualResetEvent v)
        {
            v.Reset();
        }
        private void btn_pro1_Click(object sender, EventArgs e)
        {
            operate(manual);
        }
        private void btn_pro2_Click(object sender, EventArgs e)
        {
            operate(manual2);
        }

        private void btn_pro3_Click(object sender, EventArgs e)
        {
            operate(manual3);
        }

        private void btn_pro4_Click(object sender, EventArgs e)
        {
            operate(manual4);
        }

        private void btn_stop1_Click(object sender, EventArgs e)
        {
            Stop(manual);
        }

        private void btn_stop2_Click(object sender, EventArgs e)
        {
            Stop(manual2);
        }

        private void btn_stop3_Click(object sender, EventArgs e)
        {
            Stop(manual3);
        }

        private void btn_stop4_Click(object sender, EventArgs e)
        {
            Stop(manual4);
        }
    }
}

相关文章:

  • Kube Scheduler 可观测性最佳实践
  • 【根据源码分析Vue 组件中 props的实现原理 】
  • TA学习之路——1.5纹理基础
  • 人工智能基础知识详解:从概念到前沿技术与应用
  • RAG中构建个人知识库
  • 第3课:MCP协议接口定义与开发实践
  • 医学图像分割效率大幅提升!U-Net架构升级,助力精度提升5%!
  • iPaaS集成平台使用的最佳实践:开发、测试和生产部署
  • rhcsa第三次作业
  • 解释 Git 的基本概念和使用方式
  • ZLMediaKit部署与配置
  • 【嵌入式系统设计师】知识点:第4章 嵌入式系统软件基础知识
  • 刷题(删除倒数第N个节点、搜索插入位置、二进制求和、求x平方根、爬楼梯)
  • 如何在 Windows 11 上查找计算机的 IP 地址?
  • 理解 Rust 中的 String 分配机制
  • 【Vue-组件】学习笔记
  • AI烘焙大赛中的算法:理解PPO、GRPO与DPO的罪简单的方式
  • NVR接入录像回放平台用EasyCVR打造地下车库安防:大型商居安全优选方案
  • Windows 图形显示驱动开发-WDDM 2.0功能_重排范围
  • 阿里云大模型训练与推理开发
  • wordpress 随机播放器/关键词优化的作用
  • 广州网站制作是什么/推广之家app
  • 开发者模式一直开着有危害吗/长沙网站seo
  • 页面设计软件教程/网站如何seo推广
  • 企业网络规划与设计方案/网络seo优化
  • b2b2c平台网站建设/站长资源平台