C# Winform 進度條


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進度條的功能,下面是具體效果截圖:

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM