【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.mfbz.cn/a/695875.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java中异常-异常概述+异常体系结构

一、异常概述 1、什么是异常? java程序在运行时出现的不正常情况 2、java中提供的默认的异常处理机制 java中对java程序运行时可能会出现的每种不正常情况都创建了一个唯一对应的类,在java程序运行时如果出现不正常情况,java程序就会创建…

【NOI】C++程序结构入门之循环结构三——break、continue

文章目录 前言一、循环的流程控制1.1 导入1.2 循环的打破与跳过1.2.1 break 打破1.2.2 continue 跳过1.2.3 总结 二、例题讲解问题:1468. 小鱼的航程问题:1074 - 小青蛙回来了问题:1261. 韩信点兵问题:1254. 求车速问题&#xff1…

10.结构体、共用体、枚举

头文件&#xff1a;#include<string.h> //struct&#xff1a;结构体关键字 //stu&#xff1a;结构体类型名&#xff0c;指定了一个结构体类型&#xff0c;它相当于一个模型&#xff0c;但其中并无具体数据&#xff0c;系统对之也不分配实际内存单元//使用结构体类型必须是…

【Windows】UWP - Application Frame 窗口句柄溯源

目录 一、问题描述 二、解决方案 三、测试代码 参考文献 本文出处链接&#xff1a;[https://blog.csdn.net/qq_59075481/article/details/139574981]。 一、问题描述 当 GUI 线程的窗口属于 Windows/UWP 应用程序时&#xff0c;它们始终由进程 ApplicationFrameHost 托管…

Matlab|混合策略改进的蝴蝶优化算法

目录 1 主要内容 2 部分代码 3 程序结果 4 下载链接 1 主要内容 程序主要对蝴蝶算法&#xff08;BOA&#xff09;进行改进&#xff0c;参考文献《基于改进蝴蝶优化算法的冗余机器人逆运动学求解》&#xff0c;有如下改进策略&#xff1a; 改进1&#xff1a;采用反向学习策…

2024 年最佳 iPhone 数据恢复软件

最好的 iPhone 数据恢复软件是什么&#xff1f; 说到 iPhone 数据恢复&#xff0c;拥有合适的软件对于恢复丢失或删除的文件至关重要&#xff0c;无论是照片、视频、消息、联系人还是其他重要数据。那么&#xff0c;最好的 iPhone 数据恢复软件是什么&#xff1f;有几个因素有…

信息学奥赛初赛天天练-25-CSP-J2023基础题-中序、前序与后序转换秘籍,二叉树构建、遍历技巧,以及图的拓扑排序实战应用

PDF文档公众号回复关键字:20240610 2023 CSP-J 选择题 单项选择题&#xff08;共15题&#xff0c;每题2分&#xff0c;共计30分&#xff1a;每题有且仅有一个正确选项&#xff09; 11 给定一棵二叉树&#xff0c;其前序遍历结果为&#xff1a;ABDECFG&#xff0c;中序遍历结果…

线性代数|机器学习-P11方程Ax=b求解研究

文章目录 1. 变量数和约束条件数大小分类2. 最小二乘法和Gram-schmidt变换2.1 Gram-schmidt变换2.2 最小二乘法2.2.1 损失函数-Lasso 和regression2.2.2 损失函数-Lasso2.2.3 损失函数-regression2.2.4 Regression岭回归-矩阵验证2.2.5 Regression岭回归-导数验证 3. 迭代和随机…

重新认识Word —— 制作简历

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

Elasticsearch:Open Crawler 发布技术预览版

作者&#xff1a;来自 Elastic Navarone Feekery 多年来&#xff0c;Elastic 已经经历了几次 Crawler 迭代。最初是 Swiftype 的 Site Search&#xff0c;后来发展成为 App Search Crawler&#xff0c;最近又发展成为 Elastic Crawler。这些 Crawler 功能丰富&#xff0c;允许以…

Typora Markdown编辑器 for Mac v1.8.10 安装

Mac分享吧 文章目录 效果一、准备工作二、开始安装1、双击运行软件&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕2. 应用程序显示软件图标&#xff0c;表示安装成功 三、运行调试1、修改主题2、显示文档列表&#xff0c;如下图3、查看版本信息 **安装完成&…

LearnDash+BuddyBoss:终极在线课程社区组合

您是否希望使用 WordPress 建立在线课程社区&#xff1f; 如果是这样&#xff0c;没有比LearnDash和BuddyBoss在线课程社区更好的组合了。使用这两款产品&#xff0c;您可以创建和销售在线课程、创建群组和讨论&#xff0c;并为您的学生提供整个社交网络&#xff0c;所有这些都…

CUDA 编程(1):使用Grid 和 Block分配线程

1 介绍 1.1 Grid 和 Block 概念 核函数以线程为单位进行计算的函数,cuda编程会涉及到大量的线程(thread),几千个到几万个thread同时并行计算,所有的thread其实都是在执行同一个核函数。 对于核函数(Kernel),一个核函数一般会分配1个Grid, 1个Grid又有很多个Block,1个Bloc…

【python】python GUI编程--tkinter模块初探

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

【大学物理】波动光学:光的衍射

大学物理(上) 可视化详解学习&#xff01;| 第五讲 | 31分钟学习 光的干涉与衍射_哔哩哔哩_bilibili 第13章 波动光学-4 光的衍射-1 单缝衍射_哔哩哔哩_bilibili 0 definition 衍射也是波的性质之一&#xff0c;指的是波遇到障碍物时不再沿直线传播&#xff0c;进入障碍物背…

贪吃蛇双人模式设计(2)

敲上瘾-CSDN博客控制台程序设置_c语言控制程序窗口大小-CSDN博客贪吃蛇小游戏_贪吃蛇小游戏csdn-CSDN博客​​​​​​​ 一、功能实现&#xff1a; 玩家1使用↓ → ← ↑按键来操作蛇的方向&#xff0c;使用右Shift键加速&#xff0c;右Ctrl键减速玩家2使用W A S D按键来操…

NFT 智能合约实战-快速开始(1)NFT发展历史 | NFT合约标准(ERC-721、ERC-1155和ERC-998)介绍

文章目录 NFT 智能合约实战-快速开始(1)NFT发展历史国内NFT市场国内NFT合规性如何获得NFT?如何查询NFT信息?在 OpenSea 上查看我们的 NFT什么是ERC721NFT合约标准ERC-721、ERC-1155和ERC-998 对比ERC721IERC721.sol 接口内容关于合约需要接收 ERC721 资产 onERC721Received…

使用Leaflet-canvas-label进行个性化标注实践详解

目录 前言 一、leaflet-canvas-label属性 1、地图展示属性 2、Canvas文本标注属性 3、事件列表 二、属性设置实战 1、标注放大比例 2、字体颜色和方向偏移 3、标注文字透明色设置 4、标注显示层级 三、事件绑定 1、颜色改变 2、事件绑定解析 3、标记初始化的一个小…

数据结构(4):串

只需要掌握小题&#xff0c;在考纲中占比不大 1 串的定义 1.1 基本定义 字符串 数据结构三要数&#xff1a;逻辑结构、存储结构、运算 子串必须是连续的&#xff01; 空格也是一个字符&#xff01;每个空格字符占1B 1.2 串和线性表 2 串的基本操作 比值的操作&#xff01;&…

定个小目标之刷LeetCode热题(13)

今天来看看这道题&#xff0c;介绍两种解法 第一种动态规划&#xff0c;代码如下 class Solution {public int maxSubArray(int[] nums) {int pre 0, maxAns nums[0];for (int x : nums) {// 计算当前最大前缀和pre Math.max(pre x, x);// 更新最大前缀和maxAns Math.ma…