Concurrency
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
// TASK IS FROZEN
private void executeSync_Click(object sender, RoutedEventArgs e)
{
var watch = System.Diagnostics.Stopwatch.StartNew();
RunDownloadSync();
watch.Stop();
var elapsedMs = watch.ElapsedMilliseconds;
resultsWindow.Text += $"Total execution time: { elapsedMs }";
}
private async void executeAsync_Click(object sender, RoutedEventArgs e)
{
var watch = System.Diagnostics.Stopwatch.StartNew();
// Without await it would first print out time then all the sites
await RunDownloadParallelAsync();
watch.Stop();
var elapsedMs = watch.ElapsedMilliseconds;
resultsWindow.Text += $"Total execution time: { elapsedMs }";
}
private List<string> PrepData()
{
List<string> output = new List<string>();
resultsWindow.Text = "";
output.Add("https://www.yahoo.com");
output.Add("https://www.google.com");
output.Add("https://www.microsoft.com");
output.Add("https://www.cnn.com");
output.Add("https://www.codeproject.com");
output.Add("https://www.stackoverflow.com");
return output;
}
private async Task RunDownloadAsync()
{
List<string> websites = PrepData();
foreach (string site in websites)
{
WebsiteDataModel results = await Task.Run(() => DownloadWebsite(site));
ReportWebsiteInfo(results);
}
}
private async Task RunDownloadParallelAsync()
{
List<string> websites = PrepData();
List<Task<WebsiteDataModel>> tasks = new List<Task<WebsiteDataModel>>();
foreach (string site in websites)
{
// tasks.Add(DownloadWebsiteAsync(site));
tasks.Add(Task.Run(()=>DownloadWebsite(site)))
}
var results = await Task.WhenAll(tasks);
foreach (var item in results)
{
ReportWebsiteInfo(item);
}
}
private void RunDownloadSync()
{
List<string> websites = PrepData();
foreach (string site in websites)
{
WebsiteDataModel results = DownloadWebsite(site);
ReportWebsiteInfo(results);
}
}
private WebsiteDataModel DownloadWebsite(string websiteURL)
{
WebsiteDataModel output = new WebsiteDataModel();
WebClient client = new WebClient();
output.WebsiteUrl = websiteURL;
output.WebsiteData = client.DownloadString(websiteURL);
return output;
}
private async Task<WebsiteDataModel> DownloadWebsiteAsync(string websiteURL)
{
WebsiteDataModel output = new WebsiteDataModel();
WebClient client = new WebClient();
output.WebsiteUrl = websiteURL;
output.WebsiteData = await client.DownloadStringTaskAsync(websiteURL);
return output;
}
private void ReportWebsiteInfo(WebsiteDataModel data)
{
resultsWindow.Text += $"{ data.WebsiteUrl } downloaded: { data.WebsiteData.Length } characters long.{ Environment.NewLine }";
}
}
asyncTask<int> Delay1() { awaitTask.Delay(1000); return1; }
asyncTask<int> Delay2() { awaitTask.Delay(2000); return2; }
asyncTask<int> Delay3() { awaitTask.Delay(3000); return3; }
vart1 = Delay1();
vart2 = Delay2();
vart3 = Delay3();
// Include handling of results ↓↓↓ this takes 3s in total ↓↓↓
Console.WriteLine("{0} {1} {2}", awaitt1, awaitt2, awaitt3);
// Or, without handling the results:
await Task.WhenAll(t1, t2, t3);
Console.WriteLine("All done!");