c#中Winform实现多线程异步更新UI(进度及状态信息)
作者:msay 时间:2022-08-26 05:54:40
引言
在进行Winform程序开发需要进行大量的数据的读写操作的时候,往往会需要一定的时间,然在这个时间段里面,界面ui得不到更新,导致在用户看来界面处于假死的状态,造成了不好的用户体验。所以在大量数据操作的应用上,需要使用多线程来处理这种情况。在c#中使用多线程很方便只需要使用System.Threading.Thread的一个实例的Start方法就行了,但是如何实现多线程之间的交互就不是那么简单。本文实现了用子线程去处理数据,并实时更新主线程的ui状态了。下面就开始一步步的去实现异步线程更新ui的demo程序吧。
应用背景
写入一定量的数据到文本文件中,同时需要在主界面中反应出写入数据的实时进度情况。要求:需要将写入数据封装成一个类。
实现过程
1、首先建立一个winform项目,在主窗体上拖入一个button,一个progressbar,一个lable。如下图所示。
2、编写一个处理数据的类(WriteDate),源代码如下。
public class DataWrite
{
public delegate void UpdateUI(int step);//声明一个更新主线程的委托
public UpdateUI UpdateUIDelegate;
public delegate void AccomplishTask();//声明一个在完成任务时通知主线程的委托
public AccomplishTask TaskCallBack;
public void Write(object lineCount)
{
StreamWriter writeIO = new StreamWriter("text.txt", false, Encoding.GetEncoding("gb2312"));
string head = "编号,省,市";
writeIO.Write(head);
for (int i = 0; i < (int)lineCount; i++)
{
writeIO.WriteLine(i.ToString() + ",湖南,衡阳");
//写入一条数据,调用更新主线程ui状态的委托
UpdateUIDelegate(1);
}
//任务完成时通知主线程作出相应的处理
TaskCallBack();
writeIO.Close();
}
}
3、主界面中的代码如下:
首先要建立一个委托来实现非创建控件的线程更新控件。
delegate void AsynUpdateUI(int step);
然后编写多线程去启动写入数据的方法以及回调的函数。
private void btnWrite_Click(object sender, EventArgs e)
{
int taskCount = 10000; //任务量为10000
this.pgbWrite.Maximum = taskCount;
this.pgbWrite.Value = 0;
DataWrite dataWrite = new DataWrite();//实例化一个写入数据的类
dataWrite.UpdateUIDelegate += UpdataUIStatus;//绑定更新任务状态的委托
dataWrite.TaskCallBack += Accomplish;//绑定完成任务要调用的委托
Thread thread = new Thread(new ParameterizedThreadStart(dataWrite.Write));
thread.IsBackground = true;
thread.Start(taskCount);
}
//更新UI
private void UpdataUIStatus(int step)
{
if (InvokeRequired)
{
this.Invoke(new AsynUpdateUI(delegate(int s)
{
this.pgbWrite.Value += s;
this.lblWriteStatus.Text = this.pgbWrite.Value.ToString() + "/" + this.pgbWrite.Maximum.ToString();
}), step);
}
else
{
this.pgbWrite.Value += step;
this.lblWriteStatus.Text = this.pgbWrite.Value.ToString() + "/" + this.pgbWrite.Maximum.ToString();
}
}
//完成任务时需要调用
private void Accomplish()
{
//还可以进行其他的一些完任务完成之后的逻辑处理
MessageBox.Show("任务完成");
}
效果如下:
总结
实现异步更新ui有很多种方法,但是我认为这种方式是比较灵活,能实时的获取到任务进行的状态,并且对之进行相应的处理。这种模式还适用于使用多个线程同时写入不同的数据到不同的文件中去。
源代码下载地址:Winform_jb51.rar
来源:http://www.cnblogs.com/mingjiatang/p/5079632.html
标签:winform,c#
0
投稿
猜你喜欢
c#读写App.config,ConfigurationManager.AppSettings 不生效的解决方法
2021-10-07 22:34:42
当Mybatis遇上目录树超全完美解决方案
2021-09-28 16:21:13
Android实现简单手电筒功能
2023-09-17 19:50:27
JAVA遍历Map集合的几种方法汇总
2021-09-01 12:34:07
java类加载相关知识总结
2023-10-19 13:31:57
Spring Boot实现文件上传下载
2021-11-22 21:19:36
Android仿优酷圆形菜单学习笔记分享
2023-07-31 06:02:31
java二维数组实现推箱子小游戏
2022-08-31 10:18:40
Spring使用@Autowired为抽象父类注入依赖代码实例
2023-02-01 09:30:35
C# 通过同步和异步实现优化做早餐的时间
2022-10-27 23:09:27
详解Java的MyBatis框架和Spring框架的整合运用
2022-09-19 19:22:20
JAVA 实现二叉树(链式存储结构)
2022-02-18 11:35:21
Android基于TextView实现跑马灯效果
2023-07-25 06:32:45
详解ThreadLocal为什么会内存溢出原理
2023-11-09 18:45:26
C#实现GZip压缩和解压缩入门实例
2021-05-29 08:20:45
java小数位的例子
2023-11-30 02:37:12
Activiti如何启动流程并使流程前进
2023-11-18 18:38:51
自定义log4j日志文件命名规则说明
2021-11-21 16:55:51
关于C#反射 你需要知道的
2022-01-10 04:33:19
C#基于Socket的TCP通信实现聊天室案例
2021-12-19 15:54:13