Click here to Skip to main content
12,349,148 members (55,975 online)
Click here to Skip to main content
Add your own
alternative version

Stats

54.2K views
1K downloads
28 bookmarked
Posted

Task-based Asynchronous Operation in WCF

, 30 Jun 2013 CPOL
Rate this:
Please Sign up or sign in to vote.
This article describes the new feature of WCF "Task-based asynchronous operation"

Introduction

Though performance blocking and sluggishness are the tailbacks for any application, we can easily overcome these bottlenecks by using asynchronous programming. But old-style practice for asynchronous programming is not way easy enough to write, debug and maintain. So what is the contemporary approach??

Well, in my view, this is task based asynchronous programming, which is updated in .NET 4.5 through the use of keywords await and async. But what do async and await do? async and await are the way of controlling continuation. When a method uses the async keyword, it means it is an asynchronous method, which might have an await keyword inside, and if it has an await keyword, async will activate it. So, simply async activates the await, from which point, the asynchronous has been started. There is a nice explanation that has been given here.

In WCF, we can also consider an asynchronous operation while the service operation creates a delaying call. There are three ways to implement asynchronous operations:

  • Task-based asynchronous
  • Event-based asynchronous
  • IAsyncResult asynchronous

In this article, I am going to use task-based asynchronous operation since this is the most contemporary strategy.

Okay. Let’s move to the code.

Define and Implement Service

A very simple Service contract such as:

[ServiceContract]
public interface IMessage
{
    [OperationContract]
    Task<string> GetMessages(string msg);
}

With this simple contract, the implementation is just straight forward.

public class MessageService : IMessage
{
   async Task<string> IMessage.GetMessages(string msg)
   {
      var task = Task.Factory.StartNew(() =>
                                     {
                                         Thread.Sleep(10000);
                                         return "Return from Server : " + msg;
                                     });
     return await task.ConfigureAwait(false);
   }
}

Here, the method is marked with the async keyword, which means it might use await keyword inside. It also means that the method will be able to suspend and then resume asynchronously at await points. Moreover, it points the compiler to boost the outcome of the method or any exceptions that may happen into the return type.

Service Hosting

class Program
{
    static void Main(string[] args)
    {
       var svcHost = new ServiceHost(typeof (MessageService));
       Console.WriteLine("Available Endpoints :\n");
       svcHost.Description.Endpoints.ToList().ForEach
        (endpoints=> Console.WriteLine(endpoints.Address.ToString()));
       svcHost.Open();
       Console.ReadLine();
    }
}

Service Configuration

<?xml version="1.0"?>
 <configuration>
     <system.serviceModel>
       <services>
          <service name="Rashim.RND.WCF.Asynchronous.ServiceImplementation.MessageService">
             <host>
                 <baseAddresses>
                     <add baseAddress="net.Tcp://localhost:8732/"/>
                     <add baseAddress="http://localhost:8889/"/>
                 </baseAddresses>
             </host>
             <endpoint address="Tcp" binding="netTcpBinding" 
             contract="Rashim.RND.WCF.Asynchronous.Services.IMessage"/>
             <endpoint address="Http" binding="basicHttpBinding" 
             contract="Rashim.RND.WCF.Asynchronous.Services.IMessage">
                 <identity>
                      <dns value="localhost"/>
                 </identity>
             </endpoint>
             <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange"/>
             <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
          </service>
       </services>
       <behaviors>
          <serviceBehaviors>
             <behavior>
                 <serviceMetadata/>
             </behavior>
          </serviceBehaviors>
       </behaviors>
     </system.serviceModel>
     <startup><supportedRuntime version="v4.0" 
     sku=".NETFramework,Version=v4.5"/></startup>
</configuration>

After configuring the service, we need to configure the client app to consume the service.

Define Client

A simple Console Application (Client):

class Program
 {
    static void Main(string[] args)
    {
       GetResult();
       Console.ReadLine();
    }

    private async static void GetResult()
    {
       var client = new Proxy("BasicHttpBinding_IMessage");
       var task = Task.Factory.StartNew(() => client.GetMessages("Hello"));
       var str = await task;
       str.ContinueWith(e =>
       {
          if (e.IsCompleted)
           {
              Console.WriteLine(str.Result);
           }
       });
      Console.WriteLine("Waiting for the result");
    }
 }

Client Configuration

<?xml version="1.0"?>
 <configuration>
   <system.serviceModel>
     <bindings>
       <basicHttpBinding>
         <binding name="BasicHttpBinding_IMessage" />
       </basicHttpBinding>
     </bindings>
     <client>
       <endpoint address="http://localhost:8889/Http" binding="basicHttpBinding"
          bindingConfiguration="BasicHttpBinding_IMessage" 
          contract="Rashim.RND.WCF.Asynchronous.Services.IMessage"
           name="BasicHttpBinding_IMessage" />
     </client>
   </system.serviceModel>
 </configuration>

Finally, proxy class is given below through which the client will consume the services.

public class Proxy : ClientBase<IMessage>, IMessage
 {
    public Proxy()
    {
    }
    public Proxy(string endpointConfigurationName) :
    base(endpointConfigurationName)
    {
    }
    public Task<string> GetMessages(string msg)
    {
      return Channel.GetMessages(msg);
    }
 }

That’s it. Very easy stuff though.

License

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

Share

About the Author

Md. Rashim uddin
Software Developer (Senior) KAZ Software Limited.
Bangladesh Bangladesh
I am a true visionary as well as have always been passionate about learning. I always love to work with thought-provoking personnel to develop amazing, exciting and innovative ideas as part of an aggressive team that challenges my ingenious ideas, creativeness and extensive experience.

My Blog: http://rashimuddin.wordpress.com/

My Email: rashimiiuc at yahoo dot com

You may also be interested in...

Comments and Discussions

 
GeneralMy vote of 3 Pin
Manas_Kumar5-Nov-15 3:34
professionalManas_Kumar5-Nov-15 3:34 
Questionwhat type is the variable str ? Pin
Mohamed hammad27-May-15 19:29
memberMohamed hammad27-May-15 19:29 
Questionhow the client method knows Service method is completed Pin
AshleyAlex27-Nov-14 0:59
memberAshleyAlex27-Nov-14 0:59 
SuggestionThread.Sleep(10000); Pin
Member 1063546728-Sep-14 21:55
memberMember 1063546728-Sep-14 21:55 
Questionhmmm Pin
Sacha Barber9-Sep-14 11:34
mvpSacha Barber9-Sep-14 11:34 
GeneralDecent effort Pin
Member 1089060011-Aug-14 10:00
memberMember 1089060011-Aug-14 10:00 
GeneralMy vote of 2 Pin
svshivshan2-Jul-14 21:42
membersvshivshan2-Jul-14 21:42 
QuestionOne query Pin
Tridip Bhattacharjee9-Feb-14 19:31
memberTridip Bhattacharjee9-Feb-14 19:31 
AnswerRe: One query Pin
Md. Rashim uddin11-Feb-14 19:52
memberMd. Rashim uddin11-Feb-14 19:52 
GeneralMy vote of 3 Pin
sinhar20-Nov-13 8:29
membersinhar20-Nov-13 8:29 
QuestionWindows Phone Pin
MoritzM21-Sep-13 11:36
memberMoritzM21-Sep-13 11:36 
AnswerRe: Windows Phone Pin
Md. Rashim uddin21-Sep-13 21:17
memberMd. Rashim uddin21-Sep-13 21:17 
GeneralRe: Windows Phone Pin
MoritzM1-Oct-13 0:04
memberMoritzM1-Oct-13 0:04 
GeneralMy vote of 5 Pin
Monjurul Habib14-Jul-13 3:33
professionalMonjurul Habib14-Jul-13 3:33 
GeneralRe: My vote of 5 Pin
Md. Rashim uddin14-Jul-13 4:44
memberMd. Rashim uddin14-Jul-13 4:44 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Terms of Use | Mobile
Web02 | 2.8.160621.1 | Last Updated 30 Jun 2013
Article Copyright 2013 by Md. Rashim uddin
Everything else Copyright © CodeProject, 1999-2016
Layout: fixed | fluid