在C# vNext里面使用异步语法
今天用了一个下午加上晚上体验了一回 Visual Studio 11 Developer Preview。
下面详细介绍下 C# vNext(我不知道它应该是C#5还是C#4.5)的异步语法。最关键的是2个新增加的关键字(实际上在AnsyncCTP+VS2010就有,不过和VS11的略有不同)
目前网上已经有了不少文章,不过都是围绕微软给出的一个HTTP异步访问的程序讨论,为了不重复已有的内容,我设计了另一个测试代码,以便大家更多了解异步语法。
我的测试代码如下:
private int foo(int seed){ Random r = new Random(seed); string s = ""; int i = 0; while (s != "this") { char c1 = (char)r.Next(67, 122); char c2 = (char)r.Next(67, 122); char c3 = (char)r.Next(67, 122); char c4 = (char)r.Next(67, 122); s = new string(new char[] { c1, c2, c3, c4 }); i++; } return i;}
int[] results = Enumerable.Range(0, 10) .Select(x => foo(unchecked((int)(DateTime.Now.Ticks >> x)))).ToArray();return "Result is: " + string.Join(", ", results) + ".";
int[] results = await Task.WhenAll(Enumerable.Range(0, 10) .Select(x => Task.Factory.StartNew(() => foo(unchecked((int)(DateTime.Now.Ticks >> x))))));return "Result is: " + string.Join(", ", results) + ".";
private async Task<string> bar1() { int[] results = await Task.WhenAll(Enumerable.Range(0, 10) .Select(x => Task.Factory.StartNew(() => foo(unchecked((int)(DateTime.Now.Ticks >> x)))))); return "Result is: " + string.Join(", ", results) + "."; }
private async void Button1_Click(object sender, RoutedEventArgs e) { this.textBox1.Text = await bar1(); }
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" x:Class="WpfApplication1.MainWindow" Title="MainWindow" Height="350" Width="525"> <Grid> <Button Content="async" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Click="Button1_Click"/> <TextBox x:Name="textBox1" HorizontalAlignment="Left" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Margin="0,26,0,0" Width="509" Height="42"/> <Button Content="sync" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Margin="0,67,0,0" Click="Button2_Click"/> <TextBox x:Name="textBox2" HorizontalAlignment="Left" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Margin="0,93,0,0" Width="509" Height="42"/> </Grid></Window>
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows;using System.Windows.Controls;using System.Windows.Data;using System.Windows.Documents;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Imaging;using System.Windows.Navigation;using System.Windows.Shapes;namespace WpfApplication1{ /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private async void Button1_Click(object sender, RoutedEventArgs e) { this.textBox1.Text = await bar1(); } private void Button2_Click(object sender, RoutedEventArgs e) { this.textBox2.Text = bar2(); } private int foo(int seed) { Random r = new Random(seed); string s = ""; int i = 0; while (s != "this") { char c1 = (char)r.Next(67, 122); char c2 = (char)r.Next(67, 122); char c3 = (char)r.Next(67, 122); char c4 = (char)r.Next(67, 122); s = new string(new char[] { c1, c2, c3, c4 }); i++; } return i; } private async Task<string> bar1() { int[] results = await Task.WhenAll(Enumerable.Range(0, 10) .Select(x => Task.Factory.StartNew(() => foo(unchecked((int)(DateTime.Now.Ticks >> x)))))); return "Result is: " + string.Join(", ", results) + "."; } private string bar2() { int[] results = Enumerable.Range(0, 10) .Select(x => foo(unchecked((int)(DateTime.Now.Ticks >> x)))).ToArray(); return "Result is: " + string.Join(", ", results) + "."; } }}
using System;using System.Linq;using System.Threading;namespace ConsoleApplication1{ class Program { public delegate string myString(); static void Main(string[] args) { ThreadPool.QueueUserWorkItem(h => { var query = from x in Enumerable.Range(0, 10).AsParallel() select x + "->" + foo(unchecked((int)(DateTime.Now.Ticks >> x))); Console.WriteLine("Result is: {0}.", string.Join(", ", query.ToArray())); }); Console.ReadKey(); } private static int foo(int seed) { Random r = new Random(seed); string s = ""; int i = 0; while (s != "this") { char c1 = (char)r.Next(67, 122); char c2 = (char)r.Next(67, 122); char c3 = (char)r.Next(67, 122); char c4 = (char)r.Next(67, 122); s = new string(new char[] { c1, c2, c3, c4 }); i++; } return i; } }}