博客 / 詳情

返回

推薦一種異步線程執行過程中更新進度的方法

在實際應用中,對於耗時較長或者耗費性能的操作,為了避免UI卡頓,通常採用後台異步線程的方式進行處理,但用户需要知道當前操作的執行進度(如當前進度百分比),以及一些更詳細的過程信息(如共分5步,當前是正在執行第幾步)等內容。實現此功能有很多種方法,今天介紹一種通過.NET自帶的IProgress接口實現進度上報的操作方法,謹供學習分享使用,如有不足之處,還請指正。

image

 

IProgress概述

 

IProgress接口是微軟在.NET Framework4.5及之後的版本中提供的一種用於異步方法中進度上報的方法接口及實現。IProgress<T>及它的實現類Progress<T>是泛型實現,它接收基礎數據類型或自定義的引用類型。Progress<T>初始化對象時,接收一個Action<T> 的handler,當調用接口的Report(T value)方法時,就會執行Action<T>對應的handler委託方法進行更新進度。

涉及知識點如下:

  1. Report<T value> 用於向外報告一個進度更新。
  2. Progress(Action<T> handler) 實現類的構造函數,參數為更新進度的委託。

 

示例代碼

 

在本示例中,創建Execute方法,模擬後台耗時較長的任務,並在執行過程中通過IProgress接口的Report方法上報執行進度。如下所示:

private async Task Execute(IProgress<TaskReport> progress)
{
	for (int i = 0; i < 100; i++)
	{
		//do somthing
		await Task.Delay(200);
		progress.Report(new TaskReport()
		{
			Percent=i,
			Msg=$"當前是第{i}個步驟,進行中"
		});
	}
	progress.Report(new TaskReport()
	{
		Percent=100,
		Msg="完成"
	});
}

接着創建IProgress的實例對象,並傳入當Report方法調用時,需要執行的委託RefreshUI,用於刷新頁面的進度,如下所示:

private async void btnExceute_Click(object sender, EventArgs e)
{
	IProgress<TaskReport> progress = new Progress<TaskReport>(RefreshUI);
	await Execute(progress);
}

其中RefreshUI方法,主要用於為UI頁面上的進度條和Label賦值,如下所示:

private void RefreshUI(TaskReport taskReport)
{
	this.pb1.Value = taskReport.Percent;
	this.lblMsg.Text = taskReport.Msg;
}

 

演示效果

 

運行實例,點擊執行按鈕如下所示:

GIF 2025-11-9 21-45-40

以上就是《推薦一種異步線程執行過程中更新進度的方法》的全部內容,旨在拋磚引玉,一起學習,共同進步!

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.