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

    • 逐字符添加可能会导致较长时间的输出过程,尤其是在处理长文本时,需要确保这种处理不会让用户感到困惑或不耐烦。
    • 可以考虑在输出过程中添加进度指示器或动画,来提升用户体验。
  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值