C# Asynchronous Program 3


This entry is part 4 of 4 in the series C# Asynchronous

In this example we have three blocking operations in a Windows Presentation Foundation (WPF) program. We want to download HTML from 3 different websites. We want to first display a message box telling the user to wait. This will be displayed immediately. After the user clicks OK in this message box they will wait for a second or two before seeing the other three message boxes. Meanwhile, the program main window is responsive. It is not frozen. You can move it around or re-size the main window. This give the user a better UX (user experience).

I also took the opportunity to show the message box with a title, an icon and specifically specifying the OK button.

using System.Threading.Tasks;
using System.Windows;
using System.Net;
namespace Ayschronous3
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
        private async void Button_Click(object sender, RoutedEventArgs e)
        {
            var getHtmlTask1 = GetHtmlAsync("https://begincodingnow.com");
            var getHtmlTask2 = GetHtmlAsync("http://msdn.microsoft.com");
            var getHtmlTask3 = GetHtmlAsync("https://www.w3schools.com");
            MessageBox.Show("Waiting for the 3 tasks to complete...");  // executes immediately
            var html1 = await getHtmlTask1;
            var html2 = await getHtmlTask2;
            var html3 = await getHtmlTask3;
            // the following 3 message boxes execute AFTER html is downloaded.
            MessageBox.Show(html1.Substring(0, 500),"begincodingnow.com", MessageBoxButton.OK, MessageBoxImage.Information);  
            MessageBox.Show(html2.Substring(0, 500),"msdn.microsoft.com", MessageBoxButton.OK, MessageBoxImage.Information);  
            MessageBox.Show(html3.Substring(0, 500),"www.w3schools.com", MessageBoxButton.OK, MessageBoxImage.Information);  
        }
        public async Task<string> GetHtmlAsync(string url)
        {
            var webClient = new WebClient();
            return await webClient.DownloadStringTaskAsync(url);
        }
    }
}
Series Navigation<< C# Asynchronous Program 2