Click here to Skip to main content
Click here to Skip to main content
Articles » Languages » C# » General » Downloads
 
Add your own
alternative version

C# 5.0 vNext - New Asynchronous Pattern

, 20 Nov 2010 CPOL
C# 5.0 CTP was introduced recently, this article is specally dealing with my own understanding with this realease with few sample applications
SampleCode-Async.zip
WpfApplication1
SimplestAsync
bin
Debug
AsyncCtpLibrary.dll
SimplestAsync.dll
SimplestAsync.pdb
obj
Debug
Decl
SimplestAsync.dll
SimplestAsync.pdb
DesignTimeResolveAssemblyReferencesInput.cache
SimplestAsync.dll
SimplestAsync.pdb
TempPE
Properties
WpfApplication1
bin
Debug
AsyncCtpLibrary.dll
WpfApplication1.exe
WpfApplication1.pdb
WpfApplication1.vshost.exe
WpfApplication1.vshost.exe.manifest
codeproject100x30.gif
obj
x86
Debug
Decl
WpfApplication1.exe
WpfApplication1.pdb
DesignTimeResolveAssemblyReferences.cache
DesignTimeResolveAssemblyReferencesInput.cache
GenerateResource.read.1.tlog
GenerateResource.write.1.tlog
MainWindow.baml
ResolveAssemblyReference.cache
TempPE
Properties.Resources.Designer.cs.dll
WpfApplication1.exe
WpfApplication1.g.resources
WpfApplication1.pdb
WpfApplication1.Properties.Resources.resources
WpfApplication1_MarkupCompile.cache
WpfApplication1_MarkupCompile.i.cache
Properties
Settings.settings
WpfApplication1.csproj.user
WpfApplication1.suo
WpfAsynchrony
bin
Debug
AsyncCtpLibrary.dll
WpfAsynchrony.exe
WpfAsynchrony.pdb
WpfAsynchrony.vshost.exe
WpfAsynchrony.vshost.exe.manifest
obj
x86
Debug
Decl
WpfAsynchrony.exe
WpfAsynchrony.pdb
DesignTimeResolveAssemblyReferences.cache
DesignTimeResolveAssemblyReferencesInput.cache
GenerateResource.read.1.tlog
GenerateResource.write.1.tlog
MainWindow.baml
TempPE
Properties.Resources.Designer.cs.dll
WpfAsynchrony.exe
WpfAsynchrony.g.resources
WpfAsynchrony.pdb
WpfAsynchrony.Properties.Resources.resources
WpfAsynchrony_MarkupCompile.cache
WpfAsynchrony_MarkupCompile.i.cache
Properties
Settings.settings
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
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;
using System.Net;
using System.Xml.Linq;
using System.Threading.Tasks;
using System.Threading;

namespace WpfAsynchrony
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        const string Feed = "http://www.codeproject.com/webservices/articlerss.aspx?cat={0}";
        public MainWindow()
        {
            InitializeComponent();
        }

        private void btnSync_Click(object sender, RoutedEventArgs e)
        {
            this.SynchronousCallServer();
        }

        private void btnaSyncPrev_Click(object sender, RoutedEventArgs e)
        {
            StringBuilder builder = new StringBuilder();
            this.AsynchronousCallServerTraditional(builder, 2);
        }

        public void AsynchronousCallServerTraditional(StringBuilder builder, int i)
        {
            if (i > 10)
            {
                MessageBox.Show(string.Format("Downloaded Successfully!!! Total Size : {0} chars.", builder.Length));
                return;
            }
            this.tbStatus.Text = string.Format("Calling Server [{0}]..... ", i);
            WebClient client = new WebClient();

            client.DownloadStringCompleted += (o, e) =>
            {
                builder.Append(e.Result);
                this.AsynchronousCallServerTraditional(builder, i + 1);
            };

            string currentCall = string.Format(Feed, i);
            client.DownloadStringAsync(new Uri(currentCall), null);

        }

        public void SynchronousCallServer()
        {
            WebClient client = new WebClient();

            StringBuilder builder = new StringBuilder();

            for (int i = 2; i <= 10; i++)
            {
                this.tbStatus.Text = string.Format("Calling Server [{0}]..... ", i);
                string currentCall = string.Format(Feed, i);
                string rss = client.DownloadString(new Uri(currentCall));

                builder.Append(rss);
            }

            MessageBox.Show(string.Format("Downloaded Successfully!!! Total Size : {0} chars.", builder.Length));
        }

        private async void btnaSyncPres_Click(object sender, RoutedEventArgs e)
        {
            await this.AsynchronousCallServerMordernAsync();
        }
        public async Task AsynchronousCallServerMordernAsync()
        {
            WebClient client = new WebClient();

            StringBuilder builder = new StringBuilder();

            for (int i = 2; i <= 10; i++)
            {
                try
                {
                    this.tbStatus.Text = string.Format("Calling Server [{0}]..... ", i);
                    string currentCall = string.Format(Feed, i);
                    string rss = await client.DownloadStringTaskAsync(new Uri(currentCall));

                    builder.Append(rss);
                }
                catch (Exception ex)
                {
                    this.tbStatus.Text = string.Format("Error Occurred -- {0} for call :{1}, Trying next", ex.Message, i);
                }

                MessageBox.Show(string.Format("Downloaded Successfully!!! Total Size : {0} chars.", builder.Length));
            }

        }

        private async void btnaSyncPresParallel_Click(object sender, RoutedEventArgs e)
        {
            await this.AsynchronousCallServerMordernParallelAsync();
        }

        public async Task AsynchronousCallServerMordernParallelAsync()
        {

            List<Task<string>> lstTasks = new List<Task<string>>();

            StringBuilder builder = new StringBuilder();

            for (int i = 2; i <= 10; i++)
            {
                using (WebClient client = new WebClient())
                {
                    try
                    {
                        this.tbStatus.Text = string.Format("Calling Server [{0}]..... ", i);
                        string currentCall = string.Format(Feed, i);
                        Task<string> task = client.DownloadStringTaskAsync(new Uri(currentCall));
                        lstTasks.Add(task);

                    }
                    catch (Exception ex)
                    {
                        this.tbStatus.Text = string.Format("Error Occurred -- {0} for call :{1}, Trying next", ex.Message, i);
                    }
                }


            }
            string[] rss = await TaskEx.WhenAll<string>(lstTasks);
            foreach (string s in rss)
                builder.Append(s);

            MessageBox.Show(string.Format("Downloaded Successfully!!! Total Size : {0} chars.", builder.Length));
        }

        private async void btnGoCPUBound_Click(object sender, RoutedEventArgs e)
        {
            await new SynchronizationContext().SwitchTo();  //Switch to net Thread from ThreadPool

            long result = this.DoCpuIntensiveWork(); //Very CPU intensive

            await Application.Current.Dispatcher.SwitchTo();

            MessageBox.Show(string.Format("Largest Prime number : {0}", result));

        }

        public long DoCpuIntensiveWork()
        {
            long i = 2, j, rem, result = 0;
            while (i <= long.MaxValue)
            {
                for (j = 2; j < i; j++)
                {
                    rem = i % j;
                    if (rem == 0)
                        break;
                }
                if (i == j)
                    result = i;
                i++;
            }
            return result;
        }

    }
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

Share

About the Author

Abhishek Sur
Architect
India India
Did you like his post?
 
Oh, lets go a bit further to know him better.
Visit his Website : www.abhisheksur.com to know more about Abhishek.
 
Abhishek also authored a book on .NET 4.5 Features and recommends you to read it, you will learn a lot from it.
http://bit.ly/EXPERTCookBook
 
Basically he is from India, who loves to explore the .NET world. He loves to code and in his leisure you always find him talking about technical stuffs.
 
Presently he is working in WPF, a new foundation to UI development, but mostly he likes to work on architecture and business classes. ASP.NET is one of his strength as well.
Have any problem? Write to him in his Forum.
 
You can also mail him directly to abhi2434@yahoo.com
 
Want a Coder like him for your project?
Drop him a mail to contact@abhisheksur.com
 
Visit His Blog

Dotnet Tricks and Tips



Dont forget to vote or share your comments about his Writing
Follow on   Twitter   Google+

| Advertise | Privacy | Terms of Use | Mobile
Web03 | 2.8.141223.1 | Last Updated 20 Nov 2010
Article Copyright 2010 by Abhishek Sur
Everything else Copyright © CodeProject, 1999-2014
Layout: fixed | fluid