Improving .NET Application Performance Part 7: Asynchronous Calls

In our last article we discussed guidelines for optimizing Threading. In this article we’ll look at best practices for using asynchronous calls. Asynchronous calls are non-blocking meaning when you call a method asynchronously, the calling thread returns immediately and continues execution of the current method.

Asynchronous Best Practices

This section summarizes best practices for optimized performance when using asynchronous execution:

Consider Client-Side Asynchronous Calls for UI Responsiveness

You can use asynchronous calls to increase the responsiveness of client applications. However, think about this carefully because asynchronous calls introduce additional programming complexity and require careful synchronization logic to be added to your graphical interface code.

The following code shows an asynchronous call followed by a loop that polls for the asynchronous call’s completion. You can add an exit criteria to the while condition in case you need to exit from function before call is completed. You can use the callback mechanism or wait for completion if you do not need to update the client.

IAsyncResult CallResult = SlowCall.BeginInvoke(slow,null,null);

while ( CallResult.IsCompleted == false)


   … // provide user feedback



Use Asynchronous Methods on the Server for I/O Bound Operations

You can increase the performance of your application by executing multiple operations at the same time. The two operations are not dependent on each other. For example, the following code calls two Web services. The duration of the code is the sum of both methods.

// get a reference to the proxy

EmployeeService employeeProxy = new EmployeeService();


// execute first and block until complete

employeeProxy.CalculateFederalTaxes(employee, null, null);


// execute second and block until complete


You can refactor the code as follows to reduce the total duration of the operation. In the following code, both methods execute simultaneously, which reduces the overall duration of the operation. Note that the following example uses the BeginCalculateFederalTaxes method, an asynchronous version of CalculateFederalTaxes; both of these methods are automatically generated when you reference a Web service from your client application in Visual Studio .NET.

// get a reference to the proxy

EmployeeService employeeProxy = new EmployeeService();


// start async call, BeginCalculateFederalTaxes

// call returns immediately allowing local execution to continue

IAsyncResult ar = employeeProxy.BeginCalculateFederalTaxes(employee, null, null);


// execute CalculateStateTaxes synchronously



// wait for the CalculateFederalTaxes call to finish



Avoid Asynchronous Calls That Do Not Add Parallelism

Avoid asynchronous calls that will block multiple threads for the same operation. The following code shows an asynchronous call to a Web service. The calling code blocks while waiting for the Web service call to complete. Notice that the calling code performs no additional work while the asynchronous call is executing.

// get a proxy to the Web service

customerService serviceProxy = new customerService ();


//start async call to CustomerUpdate

IAsyncResult result = serviceProxy.BeginCustomerUpdate(null,null);


// Tasks that can be done in parallel should appear here but is absent here


// wait for the asynchronous operation to complete

// Client is blocked until call is done



When code like this is executed in a server application such as an ASP.NET application or Web service, it uses two threads to do one task and offers no benefit; in fact, it delays other requests being processed. You should aim to avoid this practice.

In the next article of the .NET series, we’ll discuss Locking best practices and guidelines.