在异步编程中,有时候希望把进度展示出来,借助IProgress<in T>可以实现。 IProgress<in T>只提供了一个方法void Report(T value),通过Report方法把一个T类型的值报告给IProgress,然后IPro ...
在异步编程中,有时候希望把进度展示出来,借助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)
{
//当前get='_blank'>线程
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);
}
}
}
}
}
原标题:使用IProgress实现异步编程的进程通知
关键词:ip
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。