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

【C#线程设计】3:threadpool

实现:

(1).控件:group Box,text Box,check Box,label,botton,richtextbox

控件拉取见:https://blog.csdn.net/m0_74749240/article/details/139409510?spm=1001.2014.3001.5502​​​​​​​

代码:

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 线程3_threadpool
{public partial class Form1 : Form{public Form1(){InitializeComponent();}// 点击按钮触发的事件处理方法private void button1_Click(object sender, EventArgs e){// 获取文本框中的文本string text = textBox1.Text;// 将文本作为参数传递给线程池中的线程,并执行CopyText方法ThreadPool.QueueUserWorkItem(state => CopyText(text));}// 复制文本的方法,用于后台线程执行private void CopyText(string text){// 检查复选框1是否选中if (checkBox1.Checked){// 将文本的每个字符逐个添加到richTextBox1中,并在每个字符之后添加一个新行foreach (char ch in text){AppendText(richTextBox1, ch.ToString() + Environment.NewLine);}}// 模拟一些延迟效果Thread.Sleep(1000);// 检查复选框2是否选中if (checkBox2.Checked){// 将文本的每个字符逐个添加到richTextBox2中,并在每个字符之后添加一个新行foreach (char ch in text){AppendText(richTextBox2, ch.ToString() + Environment.NewLine);}}}// 在RichTextBox控件中安全地添加文本的方法private void AppendText(RichTextBox richTextBox, string text){// 检查是否需要在UI线程上执行操作if (richTextBox.InvokeRequired){// 在UI线程上执行操作richTextBox.Invoke(new MethodInvoker(delegate{richTextBox.AppendText(text);}));}else{// 在当前线程上执行操作richTextBox.AppendText(text);}}}
}

运行结果:

关键点

  1. 线程池任务排队: 使用 ThreadPool.QueueUserWorkItem 将任务排队到线程池中执行。这种方法可以有效利用系统资源,提高并发性能,但需要注意线程安全。

  2. 跨线程UI操作: Windows Forms 控件不是线程安全的,因此在非UI线程上操作UI控件需要通过 InvokeBeginInvoke 方法来切换到UI线程。

  3. 字符逐个处理: 为了实现按字符换行输出,需要遍历输入的字符串,逐个处理每个字符并添加到 RichTextBox 中,同时每个字符后面加上换行符。

  4. 线程安全的文本追加方法: 封装一个线程安全的 AppendText 方法,可以在需要时安全地更新 RichTextBox 控件的内容。

难点分析

  1. 线程安全问题

    • 由于 RichTextBox 只能在创建它的线程上进行操作,所以在后台线程中更新它的内容时,必须使用 InvokeBeginInvoke 方法。这些方法用于将跨线程的调用封送到控件的创建线程。
    • 忘记使用 Invoke 方法或者误用,会导致跨线程操作异常,从而引发应用程序崩溃。
  2. 性能和响应性

    • 虽然 ThreadPool 提供了一种方便的方式来管理线程,但如果大量任务同时排队,可能会影响性能。需要确保后台任务不会阻塞UI线程,从而保持应用程序的响应性。
    • 添加适当的延迟(如 Thread.Sleep(1000))可以模拟某些耗时操作,但在实际应用中,应该尽量避免长时间的阻塞操作。
  3. 用户体验

    • 逐字符添加可能会导致较长时间的输出过程,尤其是在处理长文本时,需要确保这种处理不会让用户感到困惑或不耐烦。
    • 可以考虑在输出过程中添加进度指示器或动画,来提升用户体验。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 模板显式、隐式实例化和(偏)特化、具体化的详细分析
  • IAR仿真调试
  • Ubuntu部署开源网关Apache APISIX
  • Facebook革新:数字社交的下一个阶段
  • 【内存管理】内存管理概述
  • UnityXR Interaction Toolkit 如何使用XRHand手部识别
  • Vue学习|Vue快速入门、常用指令、生命周期、Ajax、Axios
  • 【数据结构与算法】使用单链表实现队列:原理、步骤与应用
  • conntrack如何限制您的k8s网关
  • web入门(1)---6.10
  • html5实现个人网站源码
  • Ruoyi5.x RuoYi-Vue-Plus新建Translation翻译类
  • 2002NOIP普及组真题 3. 产生数
  • cefsharp124.x升级125.x(cef125.0.21/Chromium 125.0.6422.142)
  • LeetCode-day08-881. 救生艇
  • 2019年如何成为全栈工程师?
  •  D - 粉碎叛乱F - 其他起义
  • ES2017异步函数现已正式可用
  • es的写入过程
  • Java 23种设计模式 之单例模式 7种实现方式
  • Java超时控制的实现
  • js正则,这点儿就够用了
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • Python - 闭包Closure
  • React 快速上手 - 07 前端路由 react-router
  • Redux 中间件分析
  • select2 取值 遍历 设置默认值
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 记录:CentOS7.2配置LNMP环境记录
  • 区块链技术特点之去中心化特性
  • 深入浏览器事件循环的本质
  • 实现简单的正则表达式引擎
  • 使用parted解决大于2T的磁盘分区
  • 微信小程序:实现悬浮返回和分享按钮
  • 问题之ssh中Host key verification failed的解决
  • 详解移动APP与web APP的区别
  • 小程序开发中的那些坑
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 《码出高效》学习笔记与书中错误记录
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • 说说我为什么看好Spring Cloud Alibaba
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • (C++17) optional的使用
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (二)hibernate配置管理
  • (二十九)STL map容器(映射)与STL pair容器(值对)
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (四) Graphivz 颜色选择
  • (四) 虚拟摄像头vivi体验
  • (四)linux文件内容查看
  • (算法)求1到1亿间的质数或素数
  • (限时免费)震惊!流落人间的haproxy宝典被找到了!一切玄妙尽在此处!
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl