国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

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

2019-11-14 14:11:05
字體:
來源:轉載
供稿:網友

 

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 桦南县| 乌兰察布市| 岳普湖县| 乌拉特中旗| 策勒县| 莱州市| 建湖县| 淄博市| 清河县| 海阳市| 保亭| 额济纳旗| 大邑县| 黔南| 临夏县| 军事| 腾冲县| 桂阳县| 石台县| 饶阳县| 阳高县| 新化县| 久治县| 辛集市| 余干县| 南宁市| 辽中县| 旌德县| 汕尾市| 那曲县| 大关县| 平阴县| 方山县| 个旧市| 大埔县| 唐山市| 滕州市| 将乐县| 冷水江市| 万年县| 巨野县|