程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 使用IProgress實現異步編程的進程通知,iprogress異步

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

編輯:C#入門知識

使用IProgress實現異步編程的進程通知,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);
                }
            }
        }
    }
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved