Channels ▼
RSS

Tools

Using Asynchronous Methods in ASP.NET 4.5 and in MVC 4


When you run the application, if you click the Add total button, it won't block the UI. In fact, you can click on the button a dozen of times and the total values will start appearing later as the asynchronous calls finish their execution. You didn't need to think about either tasks or threads and you created a responsive UI. Of course, .NET is doing a lot of work under the hood.

Debugging asynchronous methods is simple because you can step-into and step-over just as you do with synchronous code. However, you won't have the full Call Stack details. For example, if you step into the GetSubTotalAsync method within GetCalculatedTotalAsync, if you continue the execution step-by-step and you stop after the asynchronous call to DownloadStringTaskAsync finished, you will see that the Call Stack changes and displays a row with the following label after the current method name [Resuming Async Method]. See Figures 2 and 3.


Figure 2. You have the full Call Stack details until you resume an asynchronous method call.

You can go on executing code step-by-step and you will return to the original methods that made asynchronous calls. Visual Studio doesn't display the original methods in the Call Stack window, but you can go on debugging as if you made synchronous calls.


Figure 3. The Call Stack window displays a [Resuming Async Method] label when you resume an asynchronous method call.

Exception handling in asynchronous methods

Exception handling in asynchronous methods works in the same way as in synchronous methods. The following lines show a new version of the GetSubTotalAsync method that throws an exception of type System.UriFormatException:

private static async Task<decimal> GetSubTotalAsync()
{
    var downloadedString = 
       await new WebClient().DownloadStringTaskAsync(new Uri(
                              "What's new in .NET Framework 4.5 @ www.drdobbs.com"));

    return (decimal)downloadedString[0];
}

The following lines show a new version of the MathService.GetCalculatedTotalAsync method that catch any exception that might occur in any of the asynchronous method calls. The code just returns -1 if an exception occurred and writes the exception details to the trace listeners. If you run the code, you can check that an exception that you can catch any exception thrown by any asynchronous methods without having to worry about the tasks and threads used to support the methods' execution. See Figure 4.

public static async Task<decimal> GetCalculatedTotalAsync(decimal salesTaxPercentage)
{
	try
	{
    		var subTotal = await GetSubTotalAsync();
    		var otherCharges = await GetOtherChargesAsync();
    		var subTotalPlusOtherCharges = subTotal + otherCharges;
    		var salesTax = Math.Round(
			subTotalPlusOtherCharges * salesTaxPercentage, 2, 
			MidpointRounding.AwayFromZero);

    		return subTotalPlusOtherCharges + salesTax;
	}
	catch (Exception ex)
	{
    		System.Diagnostics.Debug.WriteLine(ex.ToString());
    		return -1;
	}
}


Figure 4. An exception caught in the method that calls many chained asynchronous methods.


Related Reading


More Insights






Currently we allow the following HTML tags in comments:

Single tags

These tags can be used alone and don't need an ending tag.

<br> Defines a single line break

<hr> Defines a horizontal line

Matching tags

These require an ending tag - e.g. <i>italic text</i>

<a> Defines an anchor

<b> Defines bold text

<big> Defines big text

<blockquote> Defines a long quotation

<caption> Defines a table caption

<cite> Defines a citation

<code> Defines computer code text

<em> Defines emphasized text

<fieldset> Defines a border around elements in a form

<h1> This is heading 1

<h2> This is heading 2

<h3> This is heading 3

<h4> This is heading 4

<h5> This is heading 5

<h6> This is heading 6

<i> Defines italic text

<p> Defines a paragraph

<pre> Defines preformatted text

<q> Defines a short quotation

<samp> Defines sample computer code text

<small> Defines small text

<span> Defines a section in a document

<s> Defines strikethrough text

<strike> Defines strikethrough text

<strong> Defines strong text

<sub> Defines subscripted text

<sup> Defines superscripted text

<u> Defines underlined text

Dr. Dobb's encourages readers to engage in spirited, healthy debate, including taking us to task. However, Dr. Dobb's moderates all comments posted to our site, and reserves the right to modify or remove any content that it determines to be derogatory, offensive, inflammatory, vulgar, irrelevant/off-topic, racist or obvious marketing or spam. Dr. Dobb's further reserves the right to disable the profile of any commenter participating in said activities.

 
Disqus Tips To upload an avatar photo, first complete your Disqus profile. | View the list of supported HTML tags you can use to style comments. | Please read our commenting policy.
 

Video