演示如何使用async 和await 关键字实现异步操作,不阻塞UI。

在UI创建一个Button事件和一个Label实现信息的呈现。

XAML码如下:

<Button x:Name=“btnProcessFile”  Margin=“5”

Click=“btnProcessFile_Click”

HorizontalAlignment=“Center” Width=“120” VerticalAlignment=“Center” >

Process files

后台代码:

using System.IO;

using System.Threading;

该函数模拟实现耗时的操作

private int countCharacters()

{

int count = 0;

using(StreamReader reader= new StreamReader(“data.txt”))

{

string content = reader.ReadToEnd();

count = content.Length;

Thread.Sleep(3000); // 等待3秒模拟耗时

}

return count;

}

不使用异步方法:

private void btnProcessFile_Click(object sender, RoutedEventArgs e)

{

lblMsg.Content = “Processing File,Please wait…”;

int count = countCharacters();

lblMsg.Content = count.ToString() + " Characters in file";

}

此时UI会阻塞,在执行的3秒中,UI是阻塞的,无法拖动UI的。

使用异步方法,UI不会再阻塞的,可以再执行计算函数,UI不再阻塞,可以拖动UI。

private async void btnProcessFile_Click(object sender, RoutedEventArgs e)

{

Task task = new Task(countCharacters);

task.Start();

lblMsg.Content = “Processing File,Please wait…”;

int count = await task;//Not Block UI

lblMsg.Content = count.ToString() + " Characters in file";

}

Logo

鸿蒙生态一站式服务平台。

更多推荐