使用IProgress实现异步编程的进程通知

本文介绍在异步编程中如何使用IProgress<T>接口和Progress<T>类来实时更新UI界面的进度显示,通过具体示例展示了在不同场景下,如文件处理和远程文件下载,如何报告和处理进度。

 

在异步编程中,有时候希望把进度展示出来,借助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);
                }
            }
        }
    }
}

转载于:https://www.cnblogs.com/darrenji/p/4713699.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值