实现:
(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 线程2_backgroundworker
{public partial class Form1 : Form{// BackgroundWorker实例,用于后台任务处理private BackgroundWorker backgroundWorker;// 构造函数public Form1(){InitializeComponent();// 初始化BackgroundWorkerbackgroundWorker = new BackgroundWorker();// 绑定DoWork事件处理方法backgroundWorker.DoWork += BackgroundWorker_DoWork;// 绑定RunWorkerCompleted事件处理方法backgroundWorker.RunWorkerCompleted += BackgroundWorker_RunWorkerCompleted;}// “提交”按钮点击事件处理方法private void button1_Click(object sender, EventArgs e){// 检查BackgroundWorker是否空闲if (!backgroundWorker.IsBusy){// 获取文本框中的文本string text = textBox1.Text;// 启动BackgroundWorker执行异步任务,并传递文本作为参数backgroundWorker.RunWorkerAsync(text);}}// 后台任务处理方法private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e){// 获取传递的文本参数string text = e.Argument as string;// 用于存储字符的列表List<char> chars = new List<char>();// 检查复选框1是否选中if (checkBox1.Checked){// 将文本的每个字符添加到列表中foreach (char ch in text){chars.Add(ch);}}// 模拟一些延迟Thread.Sleep(1000);// 将结果存储在DoWorkEventArgs中e.Result = chars;}// 后台任务完成后的处理方法private void BackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e){// 从RunWorkerCompletedEventArgs中获取结果List<char> chars = e.Result as List<char>;// 检查复选框1是否选中if (checkBox1.Checked){// 将结果中的每个字符添加到richTextBox1中foreach (char ch in chars){richTextBox1.AppendText(ch.ToString() + Environment.NewLine);}}// 检查复选框2是否选中if (checkBox2.Checked){// 将结果中的每个字符添加到richTextBox2中foreach (char ch in chars){richTextBox2.AppendText(ch.ToString() + Environment.NewLine);}}}// 可选的事件处理方法(示例)private void groupBox1_Enter(object sender, EventArgs e){// 在这里处理groupBox1的Enter事件(如果需要的话)}}
}
运行结果:
小结:
难点分析:
- 当用户点击按钮时,程序会检查
BackgroundWorker
是否处于空闲状态。如果空闲,则获取文本框中的文本,并使用RunWorkerAsync
方法启动后台任务,将文本作为参数传递给BackgroundWorker
。 - 后台任务(
DoWork
方法)会将传递的文本转换为字符列表,并根据复选框的状态决定是否将字符添加到列表中。 - 使用
BackgroundWorker
组件需要理解其事件模型和线程处理机制,包括如何处理后台任务(DoWork
)以及任务完成后如何处理结果(RunWorkerCompleted
)。 - 在后台任务中操作 UI 控件(如
RichTextBox
)时,需要确保在 UI 线程上进行操作,这需要使用Invoke
方法来避免跨线程访问异常。 - 将复选框的状态与后台任务中的操作相结合,以确定是否执行特定的操作,需要一定的逻辑处理和条件判断。
- 在后台任务完成后(
RunWorkerCompleted
方法),程序会根据复选框的状态将字符逐个添加到两个不同的RichTextBox
控件中。
- 在后台任务完成后(