1. 新建一個窗體,並隱藏標題欄,拖拽一個ProgressBar進度條控件

2.后台代碼實現
1)定義委托,用於更新前端UI
delegate void AsynUpdateUI(int step);
2)在窗體加載事件里面注冊委托事件,啟動線程
private void FormClient_Load(object sender, EventArgs e)
{
int taskCount = 100;
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);
}
3)創建一個DataWrite類,用於寫入數據
internal class DataWrite
{
public delegate void UpdateUI(int step);//聲明一個更新主線程的委托
public UpdateUI UpdateUIDelegate;
public delegate void AccomplishTask();//聲明一個在完成任務時通知主線程的委托
public AccomplishTask TaskCallBack;
public void Write(object lineCount)
{
for (int i = 0; i < (int)lineCount; i++)
{
//編寫要完成事情的代碼,目前先用等待代替
Thread.Sleep(50); //等待一下,也可以去掉
//寫入一條數據,調用更新主線程ui狀態的委托
UpdateUIDelegate(1);
}
//任務完成時通知主線程作出相應的處理
TaskCallBack();
//將更新包信息寫入到客戶端文件配置中
Thread.Sleep(1000);
Application.Exit();
}
}
4)定義更新前端UI的方法
private void UpdataUIStatus(int step)
{
if (InvokeRequired)
{
this.Invoke(new AsynUpdateUI(delegate (int s)
{
this.pgbWrite.Value += s;
this.lblProcess.Text = "檢測到最新程序,正在更新請稍候("+this.pgbWrite.Value.ToString() + "%)...";
}), step);
}
else
{
this.pgbWrite.Value += step;
this.lblProcess.Text = "檢測到最新程序,正在更新請稍候(" + this.pgbWrite.Value.ToString() + "%)...";
}
}
5)定義完成任務后要調用的方法
private void Accomplish()
{
//還可以進行其他的一些完任務完成之后的邏輯處理
if (InvokeRequired)
{
this.Invoke(new AsynUpdateUI(delegate (int s)
{
lblProcess.Text = "更新完成,即將啟動客戶端...";
}), 0);
}
else {
lblProcess.Text = "更新完成,即將啟動客戶端...";
}
}
以上步驟就以異步方式實現了一個Winform進度條的功能,下面是具體效果截圖:


