I do not understand why await and async do not improve the performance of my code here as if they should .
Although I am skeptical, I thought that the compiler had to rewrite my method so that the loads would run in parallel ... but it seems like this is not really happening.
(I do understand that await and async do not create separate threads, however, the OS must download in parallel and call my code in the source thread - shouldn 't it?)
Am I using async and await incorrectly? What is the correct way to use them?
the code:
using System; using System.Net; using System.Threading; using System.Threading.Tasks; static class Program { static int SumPageSizesSync(string[] uris) { int total = 0; var wc = new WebClient(); foreach (var uri in uris) { total += wc.DownloadData(uri).Length; Console.WriteLine("Received synchronized data..."); } return total; } static async Task<int> SumPageSizesAsync(string[] uris) { int total = 0; var wc = new WebClient(); foreach (var uri in uris) { var data = await wc.DownloadDataTaskAsync(uri); Console.WriteLine("Received async'd CTP data..."); total += data.Length; } return total; } static int SumPageSizesManual(string[] uris) { int total = 0; int remaining = 0; foreach (var uri in uris) { Interlocked.Increment(ref remaining); var wc = new WebClient(); wc.DownloadDataCompleted += (s, e) => { Console.WriteLine("Received manually async data..."); Interlocked.Add(ref total, e.Result.Length); Interlocked.Decrement(ref remaining); }; wc.DownloadDataAsync(new Uri(uri)); } while (remaining > 0) { Thread.Sleep(25); } return total; } static void Main(string[] args) { var uris = new string[] {
Conclusion:
Received synchronized data... Received synchronized data... Received synchronized data... Received synchronized data... Received synchronized data... Synchronous: 14336 milliseconds Received manually async data... Received manually async data... Received manually async data... Received manually async data... Received manually async data... Manual: 8627 milliseconds // Almost twice as fast... Received async'd CTP data... Received async'd CTP data... Received async'd CTP data... Received async'd CTP data... Received async'd CTP data... Async CTP: 13073 milliseconds // Why so slow??
source share