Debbo dirlo, sono un appassionato dell’Async CTP ed una delle cose che mi piace di più è che appena installato hai subito la possibilità di vedere degli esempi di codice, tra cui il mitico 101 c# async samples. (lo trovate tra i samples, uno degli aspetti più interessanti è che di esempi ce ne sono veramente tanti)
La cosa interessante di questo esempio è che mostra come una certa operazione asincrona può essere fatta con l’aiuto di async e come invece la faremmo in C# 4.0, questo fa capire veramente bene come il codice sia veramente molto, ma molto più semplice. Per esempio quando facciamo una richiesta con un WebRequest è buona norma farla asincrona.
1: public void AsyncIntroSingleBefore()
2: {
3: var client = new WebClient();
4:
5: client.DownloadStringCompleted += AsyncIntroSingleBefore_DownloadStringCompleted;
6: client.DownloadStringAsync(new Uri("http://www.weather.gov"));
7: }
8:
9: void AsyncIntroSingleBefore_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
10: {
11: WriteLinePageTitle(e.Result);
12: }
Ok il codice non è molto, basta gestire un evento e usare il DownloadStringAsync, ed il gioco è fatto… ma con l’Async CTP è molto più semplice.
1: public async void AsyncIntroSingle()
2: {
3: WriteLinePageTitle(await new WebClient().DownloadStringTaskAsync(new Uri("http://www.weather.gov")));
4: }
Non si può non apprezzare il codice molto più coinciso. Ma la vera potenza è quando dovete fare piu operazioni asincrone, ad esempio caricare tre pagine in sequenza
1: public async void AsyncIntroSerial()
2: {
3: var client = new WebClient();
4:
5: WriteLinePageTitle(await client.DownloadStringTaskAsync(new Uri("http://www.weather.gov")));
6: WriteLinePageTitle(await client.DownloadStringTaskAsync(new Uri("http://www.weather.gov/climate/")));
7: WriteLinePageTitle(await client.DownloadStringTaskAsync(new Uri("http://www.weather.gov/rss/")));
8: }
o ancora meglio, in parallelo.
1: public async void AsyncIntroParallel()
2: {
3: Task<string> page1 = new WebClient().DownloadStringTaskAsync(new Uri("http://www.weather.gov"));
4: Task<string> page2 = new WebClient().DownloadStringTaskAsync(new Uri("http://www.weather.gov/climate/"));
5: Task<string> page3 = new WebClient().DownloadStringTaskAsync(new Uri("http://www.weather.gov/rss/"));
6:
7: WriteLinePageTitle(await page1);
8: WriteLinePageTitle(await page2);
9: WriteLinePageTitle(await page3);
10: }
Vale la pena decisamente di studiarci sopra
alk.
Tags: Async