使用IProgress實現異步編程的進程通知


 

在異步編程中,有時候希望把進度展示出來,借助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);
                }
            }
        }
    }
}


免責聲明!

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



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