封装一个进度条
1.首先定义一个处理数据需要产生进度的接口和抽象类

1 namespace Progress.Core
2 {
3 public interface IProgress
4 {
5 IProgressView m_FrmProgress { get; set; }
6 PosscessCompleted mPosscessCompleted { get; set; }
7 Thread mThread { get; }
8 bool IsStop { get; set; }
9 void Start();
10 }
11 public delegate void PosscessCompleted();
12 public class AbstractProgress : IProgress
13 {
14 private Thread m_Thread;
15 public Thread mThread
16 {
17 get
18 {
19 return m_Thread;
20 }
21 }
22 public IProgressView m_FrmProgress { get; set; }
23 public bool IsStop { get; set; }
24
25
26 public PosscessCompleted mPosscessCompleted { get; set; }
27
28 public AbstractProgress()
29 {
30 m_Thread = new Thread(new ThreadStart(WorkFunc));
31 }
32 bool isStart = false;
33 public void Start()
34 {
35 if (mThread != null && isStart == false)
36 {
37 mThread.Start();
38 isStart = true;
39 }
40 }
41 private void WorkFunc()
42 {
43 if (IsStop)
44 {
45 return;
46 }
47 ProcessData();
48 //处理完成
49 if (mPosscessCompleted != null)
50 {
51 mPosscessCompleted();
52 }
53 }
54 public virtual void ProcessData()
55 {
56 // mFrmProgress.IsFalse = true;
57 }
58 }
59
60 }
看一个子类实现:

1 class NumCul : AbstractProgress
2 {
3 public override void ProcessData()
4 {
5 int i = 0;
6 while (true)
7 {
8 if (IsStop)
9 {
10 break;
11 }
12 i++;
13 m_FrmProgress.SetTitle(i.ToString());
14 m_FrmProgress.SetProcessBar(i / 100);
15 if (i > 10000)
16 {
17 break;
18 }
19 }
20 }
21 }
2.进度条窗体的抽象接口:

1 public interface IProgressView
2 {
3 void SetTitle(string title);
4
5 void SetProcessBar(int percent);
6 }
一个进度条窗体实现:

1 public partial class FrmProgress : Form, IProgressView
2 {
3 private IProgress mProgress = null;
4 //处理进度条
5 public delegate void ProgressBarState(int per);
6 public ProgressBarState mProgressPorBar;
7 //处理文字说明
8 public delegate void TitleState(string title);
9 public TitleState mProgressTitle;
10
11 //处理按钮状态
12 public delegate void ButtonState();
13 public ButtonState mButtonState;
14
15 public FrmProgress(IProgress progress)
16 {
17 InitializeComponent();
18 mProgress = progress;
19 mProgress.m_FrmProgress = this;
20 }
21
22 private void FrmProgress_Load(object sender, EventArgs e)
23 {
24 mProgressPorBar += new ProgressBarState(SetProgressBarState);
25 mProgressTitle += new TitleState(SetTitleState);
26 mButtonState += new ButtonState(SetButtonState);
27 mProgress.mPosscessCompleted += new PosscessCompleted(IsCompeted);
28 mProgress.Start();
29 }
30 public bool IsFalse = true;
31 //给处理线程调用的
32 public void SetTitle(string title)
33 {
34 label1.Invoke(mProgressTitle, title);
35
36 }
37 //给处理线程调用的
38 public void SetProcessBar(int percent)
39 {
40 progressBar1.Invoke(mProgressPorBar, percent);
41 }
42 public void IsCompeted()
43 {
44 this.button1.Invoke(mButtonState);
45 }
46
47 void SetTitleState(string title)
48 {
49 label1.Text = title;
50 }
51 void SetProgressBarState(int percent)
52 {
53 progressBar1.Value = percent;
54 }
55 void SetButtonState()
56 {
57 Thread.Sleep(100);
58 button1.Text = "关闭";
59 }
60
61 private void button1_Click(object sender, EventArgs e)
62 {
63 if (mProgress != null)
64 {
65 mProgress.IsStop = true;
66 }
67 this.Close();
68 }
69
70 private void FrmProgress_FormClosing(object sender, FormClosingEventArgs e)
71 {
72 if (mProgress != null)
73 {
74 mProgress.IsStop = true;
75 }
76 }
77
78 }
3.调用:

1 private void button2_Click(object sender, EventArgs e)
2 {
3 IProgress pros = new NumCul();
4 Core.FrmProgress frm = new Core.FrmProgress(pros);
5 frm.ShowDialog();
6 }
作者:太一吾鱼水
文章未经说明均属原创,学习笔记可能有大段的引用,一般会注明参考文献。
欢迎大家留言交流,转载请注明出处。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程