Appear in Online Interview to test your skills and be ready for job!
Twitter Twitter LinkedIn YouTube Google
Be Interview ready ! | Search
Make friends on DotNetFunda.com and expand your network!
Winners

Win Prizes

Announcements
Like us on Facebook
Sponsor
Top Articles Author
Thu, 24-Apr-2014 Authors
All Time Authors
Sourav.Kayal
39750
Sheonarayan
34800
Niladri.Biswas
33350

Latest members | More ...


(Statistics delayed by 5 minutes)
Ads

Asynchronous programming - async & await

Ambily.Raj
Posted by under Visual Studio category on for Intermediate level | Points: 250 | Views : 5113 red flag
If you found plagiarised (copied) or inappropriate content,
please let us know the original source along with your correct email id (to communicate) for further action.


.Net 4.5 introduced the new asynchronous programming model using the asyn and await keywords. Till now asynchronous programming is little complex and the debugging of the same is painful. Now with the help of the new asynchronous programming, developers can write simple codes to do the asynchronous tasks.


Asynchronous Programming

Asynchronous programming uses a single thread which will schedule a process in an asynchronous way. Program execution will continue and the UI will be responsive to the user. Typical scenario for an asynchronous programming is a long running process like data backup, bulk data processing, time consuming calculations, etc. We can schedule the time consuming work as an asynchronous task and the user can continue with his work.


Consider the following Code, where we have a set of URLs. Getting the web response and processing the same will take time. Depends on the number of URLs in the list, time taken to complete the execution will increase.

private void LongRunningMethod()
    {
        List<string> urlList = GetSetupURLList();

        foreach(var url in urlList)
        {
            byte[] urlContents = GetContents(url);
            ProcessTheContent(urlContents);

        }
    }

    private byte[] GetContents(string url)
    {
        var data = new MemoryStream();

        var webRequest = (HttpWebRequest)WebRequest.Create(url);

        using (WebResponse webResponse = webRequest.GetResponse())
        {
            using (Stream responseStream = webResponse.GetResponseStream())
            {
                responseStream.CopyTo(data);
            }

        }
        return data.ToArray();
    }


Let us see, how we can convert the same to asynchronous using the async and await keywords.


Step 1: Modify with built-in asynchronous API calls

Along with the async and await keywords, .Net 4.5 introduced a set of asynchronous APIs like StorageFile.CopyAsync(), HttpClient.DeleteAsync(), etc. Now, our method looks like 

 private byte[] GetContents(string url)
    {

        var data = new MemoryStream();

        var webRequest = (HttpWebRequest)WebRequest.Create(url);

        using (WebResponse webResponse = webRequest.GetResponseAsync())
        {
            using (Stream responseStream = webResponse.GetResponseStream())
            {
                responseStream.CopyToAsync(data);
            }
        }

        return data.ToArray();
    }   


Step 2: Use await to wait for a response

await indicate that we need the result or the processed data from the asynchronous method for further processing.


For processing the response, we need to get the web response first, so apply the “await” operator to indicate the system to wait for the result.

 

using (WebResponse webResponse = await webRequest.GetResponseAsync())

       {-----------------------------------}


Step 3:Use async to an asynchronous method

Once you add the await operator, you will get an error for the method declaration. This indicate that the method is not asynchronous and you are trying to perform an asynchronous operation from a normal method. An asynchronous method should be denoted using the async keyword. 

private async byte[] GetContents(string url)
{------------------------------------}


Step 4: Specify return type as Task/Task<type>

Now, you will get another error near the return type. An asynchronous method should return either a Task or a Task<Type> data only.

 

private async Task<byte[]> GetContents(string url)

{------------------------------------}


Step 5: Naming convention - Asynchronous method name should end with Async

Rename the method from GetContents to GetContentsAsync

 

private async Task<byte[]> GetContentsAsync(string url)

{------------------------------------}


Now, let us modify the calling method- LongRunningMethod to use our new asynchronous method.

i.       Change method name   

byte[] urlContents =GetContentsAsync(url);

ii.      Add await

byte[] urlContents = await GetContentsAsync(url);


iii.    Add async

private async void LongRunningMethod()
{…………………………………………..}

 

iv.      Modify the return type

private async Task LongRunningMethod()
{…………………………………..}

 

v.       Modify the method name

private async Task LongRunningMethodAsync()
{………………………………………….}


Now, both the methods are converted into asynchronous methods.     

  private async Task LongRunningMethodAsync()

        {

            List<string> urlList = GetSetupURLList();

            foreach (var url in urlList)

            {
                byte[] urlContents = await GetContentsAsync(url);
                ProcessTheContentAsync(urlContents);

            }
        }

        private async Task<byte[]> GetContentsAsync(string url)
        {

            var data = new MemoryStream();

            var webRequest = (HttpWebRequest)WebRequest.Create(url);

            using (WebResponse webResponse = await webRequest.GetResponseAsync())

            {
              using (Stream responseStream = webResponse.GetResponseStream())

                {

                   responseStream.CopyToAsync(data);

                }
            }

            return data.ToArray();
}


When you run the asynchronous methods, you can notice that the application is responsive even though the process is not over.


Conclusion

With the help of the .Net 4.5 asynchronous programming, we can convert a synchronous method into an asynchronous method very easily. Also the code is not so complex.
 

Page copy protected against web site content infringement by Copyscape
Found interesting? Add this to:




About the Author

Ambily.Raj

Full Name: Ambily KK
Member Level: Silver
Member Status: Member,Microsoft_MVP,MVP
Member Since: 5/18/2010 1:05:25 AM
Country: India
Thanks Ambily K K http://ambilykk.com/
http://ambilykk.com/

I have over 9 years of experience working on Microsoft Technologies. I am carrying the passion on Microsoft technologies specifically on web technologies such as ASP .Net and Ajax. My interests also include Office Open XML, Azure, Visual Studio 2010. Technology adoption and learning is my key strength and technology sharing is my passion.
Login to vote for this post.

Comments or Responses


Login to post response.

Comments / Responses
Select text & click toolbar to format. Formatting appears in viewmode only. HTML Tags are not allowed.
Bold Italic Underline Paragraph Title Code  Link 
 Wait ... Processing ..... please wait.

Comment using Facebook