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。如下图所示。

c#中Winform实现多线程异步更新UI(进度及状态信息)

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("任务完成");
 }

效果如下:

c#中Winform实现多线程异步更新UI(进度及状态信息) 

总结

实现异步更新ui有很多种方法,但是我认为这种方式是比较灵活,能实时的获取到任务进行的状态,并且对之进行相应的处理。这种模式还适用于使用多个线程同时写入不同的数据到不同的文件中去。

源代码下载地址:Winform_jb51.rar

来源:http://www.cnblogs.com/mingjiatang/p/5079632.html

标签:winform,c#
0
投稿

猜你喜欢

  • Java序列化常见的三个问题

    2023-11-21 08:40:52
  • Android语音声波控件 Android条形波控件

    2023-10-29 02:03:05
  • 详解Spring框架下向异步线程传递HttpServletRequest参数的坑

    2021-05-31 04:45:21
  • Java动态代理四种实现方式详解

    2022-03-12 02:16:38
  • Java NIO实现多人聊天室

    2022-04-05 09:03:17
  • Java编写实现坦克大战小游戏

    2023-11-24 09:15:34
  • SpringBoot 3.0 新特性内置声明式HTTP客户端实例详解

    2022-11-25 13:47:20
  • C#通过正则表达式实现提取网页中的图片

    2022-03-30 05:03:03
  • Spring自动配置之condition条件判断下篇

    2023-10-15 10:04:59
  • C#实现动态执行字符串脚本(优化版)的示例代码

    2022-06-10 19:13:54
  • Java命令行下Jar包打包小结

    2023-01-04 19:25:44
  • Java详解实现多线程的四种方式总结

    2023-04-04 19:43:34
  • Spring Boot如何使用Spring Security进行安全控制

    2022-03-26 03:59:41
  • 解读JDK8踩坑JCE加密限制版本问题

    2021-09-20 12:42:35
  • Java根据ip地址获取归属地实例详解

    2023-11-25 06:24:38
  • java分页工具类的使用方法

    2023-08-17 02:00:14
  • Java判断变量是否为空问题的方法总结

    2023-02-03 12:23:09
  • Android Studio gradle 编译提示‘default not found’ 解决办法

    2023-07-19 09:23:06
  • java实现简单银行家算法

    2022-01-31 23:33:19
  • c#读取XML多级子节点

    2023-10-10 21:03:44
  • asp之家 软件编程 m.aspxhome.com