【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. 用户体验

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/346474.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全球AI速递6.11

1.快手:发布“可灵”视频生成大模型。 2.OPPO:计划让约 5 千万用户的手机搭载生成式 AI。 3.腾讯:发布了针对混元文生图开源大模型(混元DiT)加速库。 4.Stability AI:开源Stable Audio Open AI 模型&am…

重新认识Word —— 制作简历

重新认识Word —— 制作简历 PPT的图形减除功能word中的设置调整页边距进行排版表格使用 我们之前把word长排版文本梳理了一遍,其实word还有另外的功能,比如说——制作简历。 在这之前,我们先讲一个小技巧: PPT的图形减除功能 …

重学Spring总结

1、Spring框架的诞生 文章目录 1、Spring框架的诞生1、BeanFactory 快速入门1.1、BeanFactory完成了loC思想的实现:1)导入Spring相关的依赖:2)定义Uservice接口及其UserviceImpl实现类;3)创建Bean的配置资源文件,文件名最好为&…

Windows 服务器Nginx 下载、部署、配置流程(图文教程)

不定期更新 目录 一、下载Nginx安装包 二、上传安装包 三、启动Nginx 四、Nginx常用命令 五、Nginx(最小)配置详解 六、Nginx(基础)配置详解 七、反向代理 八、负载均衡 九、动静分离 十、报错 一、下载Nginx安装包 四…

vue29:普通组件的注册使用

<template><div class"App"><!-- 头部组件 --><HmHeader></HmHeader><!-- 主体组件 --><HmMain></HmMain><!-- 底部组件 --><HmFooter></HmFooter><!-- 如果 HmFooter tab 出不来 → 需要配置…

通过技术优化财务规划报告,重塑企业体验

财务报告使企业的管理层能够及时、准确、清晰且一致地了解整个企业的财务业绩和风险机遇。它促进了企业内部利益相关者之间的沟通&#xff0c;从而支持基于数据驱动的洞察力提升和战略决策。但财务报告往往需要占用大量的时间来运行和准备&#xff0c;且可能使最终结论偏离核心…

腾讯云大数据ES Serverless

Elasticsearch&#xff1a;日志和搜索场景首选解决方案。 技术特点&#xff1a;分布式、全文搜索和数据分析引擎&#xff0c;可以对海量数据进行准实时地存储、搜索和统计分析。 ES的技术栈一共包含四个组件&#xff1a; 其中最核心的是Elasticsearch&#xff0c;可用于数据…

LVGL移植和图片显示

最近闲来无事&#xff0c;偶尔刷到了移植LVGL的教程&#xff0c;今天肝完了机械原理又移植完LVGL库&#xff0c;真是收获满满的一天&#xff0c;先接一杯水去。 回来了&#xff0c;发个朋友圈高级一下&#xff0c;好困。 lvgl v8.3移植及组件使用_lvgl界面编辑器-CSDN博客htt…

RAG:如何从0到1搭建一个RAG应用

通过本文你可以了解到&#xff1a; 什么是RAG&#xff1f;如何搭建一个RAG应用&#xff1f;目前开源的RAG应用有哪些&#xff1f; 大模型学习参考&#xff1a; 1.大模型学习资料整理&#xff1a;大模型学习资料整理&#xff1a;如何从0到1学习大模型&#xff0c;搭建个人或企业…

手机连接ESP8266的WIFI,进入内置网页,输入要显示的内容,在OLED显示屏上显示文本

在这篇技术博客中&#xff0c;我们将探讨如何使用ESP8266 Wi-Fi 模块和SSD1306 OLED显示屏&#xff0c;构建一个简易的信息显示和交互系统。此系统能够让用户通过一个简单的Web界面输入信息&#xff0c;并将其显示在OLED屏幕上。这种设备的应用非常广泛&#xff0c;可以用于智能…

vue实现pdf下载——html2canvas

html2canvas 官方文档https://html2canvas.hertzen.com/getting-started html2canvas 的原理是通过遍历DOM树,将每一个HTML元素转化为Canvas对象,并叠加到一起形成一张完整的图片或者PDF文件。 1. 安装插件 npm install html2canvas jspdf --save 2.使用&#xff08;页面已经…

Leetcode刷题笔记9

1. 两数之和 1. 两数之和 - 力扣&#xff08;LeetCode&#xff09; 解法一&#xff1a;暴力枚举 没什么好说的&#xff0c;直接使用两个for循环&#xff0c;i从第一个元素开始&#xff0c;j从第二个元素开始遍历并寻找 时间复杂度&#xff1a;O(N^2) 空间复杂度&#xff1a…

4_机械臂位姿求逆理论及代码计算

1、aubo arcs sdk poseInverse 使用例子 auto cur_pose rpc_cli->getRobotInterface(robot_name)->getRobotState()->getTcpPose();// 2.288083 0.035207 1.550335auto pose_inv rpc_cli->getMath()->poseInverse(cur_pose);//结果&#xff1a;0.118611 -0.57…

blender

通用设置&#xff1a; 仅显示/取消隐藏&#xff1a;数字键盘/ 移动视角&#xff1a;shift鼠标中键 Blender如何给场景添加参考图片-百度经验 (baidu.com) 进入编辑模式&#xff1a;Tab 编辑模式&#xff1a;点-线-面 两个视图 法向显示&#xff1a;就能变成恶心的蓝红色 显…

自动驾驶---Perception之视觉点云雷达点云

1 前言 在自动驾驶领域&#xff0c;点云技术的发展历程可以追溯到自动驾驶技术的早期阶段&#xff0c;特别是在环境感知和地图构建方面。 在自动驾驶技术的早期技术研究中&#xff0c;视觉点云和和雷达点云都有出现。20世纪60年代&#xff0c;美国MIT的Roberts从2D图像中提取3D…

解锁ChatGPT:从GPT-2实践入手解密ChatGPT

⭐️我叫忆_恒心&#xff0c;一名喜欢书写博客的研究生&#x1f468;‍&#x1f393;。 如果觉得本文能帮到您&#xff0c;麻烦点个赞&#x1f44d;呗&#xff01; 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧&#xff0c;喜欢的小伙伴给个三连支…

LabVIEW开发实验室超导体电流特性测试系统

本系统旨在为学校实验室提供一个基于LabVIEW的超导体电流特性测试平台&#xff0c;通过精确测量超导体在不同温度和电流条件下的电学特性&#xff0c;帮助学生和研究人员深入理解超导体的物理性质。本文将从背景、目标、工作原理、使用方法、操作流程和注意事项等方面详细介绍该…

现代x86汇编-环境安装

今天端午节&#xff0c;独自在家&#xff0c;翻阅了张银奎老师编写的《现代x86汇编语言程序设计》一书&#xff0c;前言部分说明书中示例代码都是用微软visual C工具编写并使用微软宏汇编&#xff08;著名的MASM&#xff09;编译的&#xff0c;好久没有用微软vc了&#xff0c;假…

【UML用户指南】-13-对高级结构建模-包

目录 1、名称 2、元素 3、可见性 4、引入与引出 用包把建模元素安排成可作为一个组来处理的较大组块。可以控制这些元素的可见性&#xff0c;使一些元素在包外是可见的&#xff0c;而另一些元素要隐藏在包内。也可以用包表示系统体系结构的不同视图。 狗窝并不复杂&#x…

排序题+贪心

排序力扣题 一&#xff1a;合并区间 56. 合并区间 方法一&#xff1a;先排序再合并 如图&#xff0c;把区间按照起点从小到达排序&#xff0c;如果起点相同那么按照终点小的优先排序 然后每次记录一个区间&#xff0c;访问下一个区间&#xff1a; 如果下一个区间的起点<前…