标签:copy ted update sdn 程序 close net data val
在进行Winform程序开发需要进行大量的数据的读写操作的时候,往往会需要一定的时间,然在这个时间段里面,界面ui得不到更新,导致在用户看来界面处于假死的状态,造成了不好的用户体验。所以在大量数据操作的应用上,需要使用多线程来处理这种情况。在c#中使用多线程很方便只需要使用System.Threading.Thread的一个实例的Start方法就行了,但是如何实现多线程之间的交互就不是那么简单。本文实现了用子线程去处理数据,并实时更新主线程的ui状态了。下面就开始一步步的去实现异步线程更新ui的demo程序吧。
应用背景
实现过程
1、首先建立一个winform项目,在主窗体上拖入一个button,一个progressbar,一个lable。如下图所示。
publicclass DataWrite
{
publicdelegatevoid UpdateUI(int step);//声明一个更新主线程的委托public UpdateUI UpdateUIDelegate;
publicdelegatevoid AccomplishTask();//声明一个在完成任务时通知主线程的委托public AccomplishTask TaskCallBack;
publicvoid 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();
}
}
delegatevoid AsynUpdateUI(int step);
privatevoid btnWrite_Click(object sender, EventArgs e)
{
int taskCount = 10000; //任务量为10000this.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);
}
//更新UIprivatevoid 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();
}
}
//完成任务时需要调用privatevoid Accomplish()
{
//还可以进行其他的一些完任务完成之后的逻辑处理
MessageBox.Show("任务完成");
}
标签:copy ted update sdn 程序 close net data val
原文地址:http://www.cnblogs.com/as3lib/p/6418926.html