弁言
在举行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有许多种要领,然则我以为这类体式格局是比较天真,能及时的猎取到使命举行的状况,而且对之举行响应的处置惩罚。这类形式还适用于运用多个线程同时写入差别的数据到差别的文件中去。
以上就是概况引见c#中Winform完成多线程异步更新UI的示例代码的细致内容,更多请关注ki4网别的相干文章!