实现:
(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();
// 初始化BackgroundWorker
backgroundWorker = 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
控件中。
- 在后台任务完成后(