C# 5.0以后异步编程(线程)变得非常简单而直观,写起来基本就跟顺序编程差不多,逻辑清晰很多。不过我们这些从C#3.0或者更早版本过来的老猿对这些新事物还是有些不适应的,这里给一个简单的示例,演示如何利用async, await实现异步耗时操作,并且通过IProgress实现进度返回并更新UI。
程序非常简单,界面上有一个Button和一个TextBox, 其中TextBox用来显示进度
//更新界面的函数
private void ReportProgress(int val)
{
StatusText.Text = val.ToString() + "%";
}
//耗时操作函数
private Task TimeConsumeFunction(IProgress<int> progressRptr)
{
var task = Task.Run(() =>
{
for (int i = 0; i <= 100; i++)
{
Thread.Sleep(10);//sleep演示耗时
progressRptr.Report(i);//报告进度
}
});
return task;
}
//通过await异步调用耗时操作,并更新进度到UI
private async void StartButton_Click(object sender, RoutedEventArgs e)
{
var progressReporter = new Progress<int>(ReportProgress);
await TimeConsumeFunction(progressReporter);
}