Pages

Monday, March 11, 2013

I have been writing many posts about asynchronous operations and thought to write about asynchronous operations in WCF. In WCF, asynchronous operations can be implemented by using one of the three following methods:

The event-based asynchronous pattern

The IAsyncResult asynchronous pattern

The task-based asynchronous pattern

Today I am going to explain how to implement asynchronous operations in WCF using each of these methods using some examples. In here I will not be covering the basics of WCF and I assume you all have some experience with programming WCF before. So I will start off with the event-based pattern.

1. The event-based asynchronous pattern

I have created a WCF Service Application and I have the default WCF service and it’s interface and I am modifying the service and it's contract as follows.

iService1.cs

[ServiceContract]

publicinterface IService1

{

//event-based asynchronous pattern

[OperationContract]

string GetData(string message);

}

Service1.cs

publicclass Service1 : IService1

{

publicstring GetData(string message)

{

Thread.Sleep(5000);

return message;

}

}

As you can see, In my service contract I have exposed a very simple method which will accept string and return a string. In my service I have it implemented and I have put a thread sleep, just for demonstration purposes.

Now I have my client console application and I am adding a Service Reference to this service. A thing to note here is I am enabling "Allow generation of asynchronous operations" and under that I am enabling "Generate asynchronous operations".

Add Service Reference

Generate Asynchronous Operations

When this is selected only, the proxy class will contain relevant methods for asynchronous operations for both event-based asynchronous pattern and IAsyncResult asynchronous pattern.

In here what happens is first I am subscribing to the GetDataCompleted method. When the GetDataAsync Method has completed, client_GetDataCompleted event will be triggered. If you notice the control flow here, the operations in the server are still done synchronously, but operations in the client are done asynchronously.

Finally the output will be as follows, first it will print the “Waiting for async operation” and then it will print the message returned from the service.

Output

2. The IAsyncResult asynchronous pattern

The second way of implementing WCF service operation in an asynchronous fashion is marking the <Begin> method with the AsyncPattern property set to true. In this case, the asynchronous operation is exposed with two additional methods;

a method to start asynchronous operation (a method which has “Begin” pre fixed to original method name)

a method to end asynchronous operation (a method which has “End” pre fixed to original method name).

We can further divide this IAsyncResult asynchronous pattern into two sub models. That is,

Client Side Asynchronous

Both Side Asynchronous (Client & Server Side Asynchronous)

2.1. Client Side Asynchronous

For this Client-Side Asynchronous model, I will take the same WCF Service I got for demonstrating event-based asynchronous pattern.

iService1.cs

[ServiceContract]

publicinterface IService1

{

//event-based asynchronous pattern

[OperationContract]

string GetData(string message);

}

Service1.cs

publicclass Service1 : IService1{

publicstring GetData(string message)

{

Thread.Sleep(5000);

return message;

}

}

Now in my client console application I am using the same service reference.

In here, I am calling the BeginGetData method which is generated by the proxy. It will always have it’s first parameter as the same parametes in the method I am calling asynchronously, plus two additional parameters. The second parameter is an AsyncCallback delegate that references a method to be called when the BeginGetData completes.The third parameter is a object which contain state about the asynchronous operation. So when my asynchronous BeginGetData completed, my callback method will be called. In my callback method I am calling the EndGetDate method (again which is generated by the proxy) to end the asynchronous operation and to retrieve the results.

Again the output will be as follows: first it will print the “Waiting for async operation” and then will print the message returned from the service.

Output

2.2. Both Side Asynchronous

The Both-Side Asynchronous model of IAsyncResult asynchronous pattern is little bit different. In here we have both client side and server side operations asynchronous. If you have been reading the post carefully, when I am introducing the IAsyncResult asynchronous pattern, I have mentioned about setting AsyncPattern property to true to the begin method. And to above Client Side Asynchronous model of IAsyncResult asynchronous pattern, I didn’t do that. Now let’s take a look at the following model.

The output is the same: first it will print the “Waiting for async operation” and then it will print the message returned from the service.

Output

3. The task-based asynchronous pattern

The task-based asynchronous pattern is the preferred way to implement asynchronous operations because it is the easiest and most straight forward. But the only thing is async/await was introduced with .NET framework 4.5. To demonstrate task-based asynchronous pattern, I am creating new WCF service.

iService3.cs

[ServiceContract]

publicinterface IService3

{

//task-based asynchronous pattern

[OperationContract]

Task<string> MyWorkerMethodAsync(string message);

}

Service3.cs

publicclass Service3 : IService3

{

public async Task&lt;string&gt; MyWorkerMethodAsync(string message)

{

return await Task.Factory.StartNew(() =>; MyMethod(message));

}

privatestring MyMethod(string message)

{

Thread.Sleep(5000);

return message;

}

}

Now in my client console application when I am adding a Service Reference I am enabling "Allow generation of asynchronous operations" and under that I am enabling "Generate task-based operations".

Generate Task-Based Operations

Now let’s see the client side code. Please make sure to change the Clients’ targeted framework to .NET Framework 4.5. In the client I have a async method and inside the async method, the await operator is applied to a task to suspend execution of the method until the task is completed.

Thursday, March 7, 2013

Sometime back I wrote a post about What's new in C# 5.0 and in there I wrote about async modifier and await operator. Though async and await was introduced with .NET 4.5, haven’t you ever wished to use them projects targeted .NET Framework 4.0, Silverlight 4 or Windows Phone 7.5. Well there were many times I wanted use async and await, but since I was on .NET 4.0, I had to stick to legacy asynchronous programming patterns.

But now we will not have to go to other choices anymore. If your project is targeted are on .NET Framework 4.0, Silverlight 4, Windows Phone 7.5 or higher versions of any of these and if you want you async/await, you can go for it using this Async Targeting Pack Nuget Package which was released by .NET Base Class Library Team.

To add a reference to this NuGet Package, right click on your project, select “Manage Nuget Packages” and search for Microsoft.Bcl.Async.

Add Nuget Package

Please make sure to select "Include Prerelease" on top left drop down and since this package is marked as prerelease software, there are some known issues and issues are expected.

You can also install this package via the Package Manager Console by running the following command:

install-package Microsoft.Bcl.Async –pre

Important thing to note is, you need to open your project using Visual Studio 2012 and set the target framework. Because this package is not supported in Visual Studio 2010 and if you open the project using Visual Studio 2010 and install the package, you will still be not able to use async/await.