在異步編程中,有時候希望把進度展示出來,借助IProgress<in T>可以實現。
IProgress<in T>只提供了一個方法void Report(T value),通過Report方法把一個T類型的值報告給IProgress,然後IProgress<in T>的實現類Progress<in T>的構造函數接收類型為Action<T>的形參,通過這個委托讓進度顯示在UI界面中。
首先寫一個方法,使用Report方法報告進度。
public void DoProcessing(IProgress<int> progress){for (int i = 0; i != 100; ++i){Thread.Sleep(100);if (progress != null){progress.Report(i);}}}
如何讓這個進度顯示到UI界面中呢?
實現IProgress<in T>接口的Progress<int T>類,接收一個Action<T>,通過這個委托讓進度顯示到UI界面中。
private async void button1_Click(object sender, EventArgs e){//當前線程var progress = new Progress<int>(percent => { label1.Text = percent + "%"; });//線程池線程await Task.Run(() => DoProcessing(progress));label1.Text = "結束";}
又比如,當需要異步讀取一個遠程文件。
public async Task DownloadFileAsync(string fileName, IProgress<int> progress){using(var fileStream...){using(var ftpStream = ...){while(true){//異步讀取數據var bytesRead = await ftpStream.ReadAsync(...);if(bytesRead == 0){return;}//異步寫數據await fileStream.WriteAsync(...);if(progress != null){progress.Report(bytesRead);}}}}}