原文地址:http://www.codearsenal.net/2012/11/csharp-5-async-and-await-example.html
C# 5.0 和 .NET Framework 4.5 为程序员带来了他们钟爱的异步编程功能。异步编程基于平行任务库(TPL - Task Parallel Library)。你可能了解过,在很多方面用传统技术去编写异步程序是很复杂的,而当我们要写多线程应用时,新的异步编程功能就让生活变得简单了。
今天我们要实现一个异步编程小例子,这个WPF应用中会用到Async,Await和Task关键字。
创建一个只有按钮和文本框的WPF小程序。通过这个按钮去调用一些低效的方法(命名为‘SlowDude’)。在方法执行结束之前,我不希望用户窗口会一直被锁住。换句话说,我希望异步地调用这个方法。
Ok, 以下是XAML代码:
<Window x:Class="WpfAsync.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="CodeArsenal.net" Height="180" Width="360"> <DockPanel> <Button Name="buttonAsync" Height="50" Content="Async Example" DockPanel.Dock="Top" Click="buttonAsync_Click" /> <TextBox Name="textBoxResults" DockPanel.Dock="Bottom" Margin="0,20,0,0" TextWrapping="Wrap" FontFamily="Lucida Console" FontSize="10" AcceptsReturn="True" /> </DockPanel> </Window>正如你看到的,点击按钮之后,会激活buttonAsync_Click方法
private async void buttonAsync_Click(object sender, RoutedEventArgs e) { buttonAsync.IsEnabled = false; var slowTask = Task<string>.Factory.StartNew(() => SlowDude()); textBoxResults.Text += "Doing other things while waiting for that slow dude...\r\n"; await slowTask; textBoxResults.Text += slowTask.Result.ToString(); buttonAsync.IsEnabled = true; } private string SlowDude() { Thread.Sleep(2000); return "Ta-dam! Here I am!\r\n"; }你注意到buttonAsync_Click方法前的async修饰符了吗?这就是关键,它告诉编译器,这个方法包含了使用await关键字进行异步运行的代码。
以下是以异步方式调用SlowDude的实际代码:
var slowTask = Task<string>.Factory.StartNew(() => SlowDude());OK,现在让我们看下面这行:
await slowTask;这行命令的意思是——做这两行代码之间的其他事情,不要锁住主线程。而且SlowDude一旦完成,就进行下一步处理。
嗯,我觉得异步编程是个很棒的玩意儿,在面对多线程问题的时候,它让我们的生活轻松了许多。干得漂亮,Microsoft!