Winform实现多线程异步更新UI(进度及状态信息) Winform实现多线程异步更新UI(进度及状态信息)
在进行Winform程序开发需要进行大量的数据的读写操作的时候,往往会需要一定的时间,然在这个时间段里面,界面ui得不到更新,导致在用户看来界面处于假死的状态,造成了不好的用户体验。所以在大量数据操作的应用上,需要使用多线程来处理这种情况。在c#中使用多线程很方便只需要使用System.Threading.Thread的一个实例的Start方法就行了,但是如何实现多线程之间的交互就不是那么简单。本文实现了用子线程去处理数据,并实时更新主线程的ui状态了。下面就开始一步步的去实现异步线程更新ui的demo程序吧。
应用背景
实现过程
1、首先建立一个winform项目,在主窗体上拖入一个button,一个progressbar,一个lable。如下图所示。
- 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();
- }
- }
- 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("任务完成");
- }
- 感谢您的阅读,如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮。本文欢迎各位转载,但是转载文章之后必须在文章页面中给出作者和原文连接。