How to: Implement an Asynchronous Service Operation - WCF (2024)

  • Article

In Windows Communication Foundation (WCF) applications, a service operation can be implemented asynchronously or synchronously without dictating to the client how to call it. For example, asynchronous service operations can be called synchronously, and synchronous service operations can be called asynchronously. For an example that shows how to call an operation asynchronously in a client application, see How to: Call Service Operations Asynchronously. For more information about synchronous and asynchronous operations, see Designing Service Contracts and Synchronous and Asynchronous Operations. This topic describes the basic structure of an asynchronous service operation, the code is not complete. For a complete example of both the service and client sides, see Asynchronous.

Implement a service operation asynchronously

  1. In your service contract, declare an asynchronous method pair according to the .NET asynchronous design guidelines. The Begin method takes a parameter, a callback object, and a state object, and returns a System.IAsyncResult and a matching End method that takes a System.IAsyncResult and returns the return value. For more information about asynchronous calls, see Asynchronous Programming Design Patterns.

  2. Mark the Begin method of the asynchronous method pair with the System.ServiceModel.OperationContractAttribute attribute and set the OperationContractAttribute.AsyncPattern property to true. For example, the following code performs steps 1 and 2.

     [OperationContractAttribute(AsyncPattern=true)] IAsyncResult BeginServiceAsyncMethod(string msg, AsyncCallback callback, object asyncState); // Note: There is no OperationContractAttribute for the end method. string EndServiceAsyncMethod(IAsyncResult result);}
     <OperationContractAttribute(AsyncPattern:=True)> _ Function BeginServiceAsyncMethod(ByVal msg As String, ByVal callback As AsyncCallback, ByVal asyncState As Object) As IAsyncResult ' Note: There is no OperationContractAttribute for the end method. Function EndServiceAsyncMethod(ByVal result As IAsyncResult) As StringEnd Interface
  3. Implement the Begin/End method pair in your service class according to the asynchronous design guidelines. For example, the following code example shows an implementation in which a string is written to the console in both the Begin and End portions of the asynchronous service operation, and the return value of the End operation is returned to the client. For the complete code example, see the Example section.

    public IAsyncResult BeginServiceAsyncMethod(string msg, AsyncCallback callback, object asyncState){ Console.WriteLine("BeginServiceAsyncMethod called with: \"{0}\"", msg); return new CompletedAsyncResult<string>(msg);}public string EndServiceAsyncMethod(IAsyncResult r){ CompletedAsyncResult<string> result = r as CompletedAsyncResult<string>; Console.WriteLine("EndServiceAsyncMethod called with: \"{0}\"", result.Data); return result.Data;}
    Public Function BeginServiceAsyncMethod(ByVal msg As String, ByVal callback As AsyncCallback, ByVal asyncState As Object) As IAsyncResult Implements ISampleService.BeginServiceAsyncMethod Console.WriteLine("BeginServiceAsyncMethod called with: ""{0}""", msg) Return New CompletedAsyncResult(Of String)(msg)End FunctionPublic Function EndServiceAsyncMethod(ByVal r As IAsyncResult) As String Implements ISampleService.EndServiceAsyncMethod Dim result As CompletedAsyncResult(Of String) = TryCast(r, CompletedAsyncResult(Of String)) Console.WriteLine("EndServiceAsyncMethod called with: ""{0}""", result.Data) Return result.DataEnd Function

Example

The following code examples show:

  1. A service contract interface with:

    1. A synchronous SampleMethod operation.

    2. An asynchronous BeginSampleMethod operation.

    3. An asynchronous BeginServiceAsyncMethod/EndServiceAsyncMethod operation pair.

  2. A service implementation using a System.IAsyncResult object.

using System;using System.Collections.Generic;using System.ServiceModel;using System.Text;using System.Threading;namespace Microsoft.WCF.Documentation{ [ServiceContractAttribute(Namespace="http://microsoft.wcf.documentation")] public interface ISampleService{ [OperationContractAttribute] string SampleMethod(string msg); [OperationContractAttribute(AsyncPattern = true)] IAsyncResult BeginSampleMethod(string msg, AsyncCallback callback, object asyncState); //Note: There is no OperationContractAttribute for the end method. string EndSampleMethod(IAsyncResult result); [OperationContractAttribute(AsyncPattern=true)] IAsyncResult BeginServiceAsyncMethod(string msg, AsyncCallback callback, object asyncState); // Note: There is no OperationContractAttribute for the end method. string EndServiceAsyncMethod(IAsyncResult result); } public class SampleService : ISampleService { #region ISampleService Members public string SampleMethod(string msg) { Console.WriteLine("Called synchronous sample method with \"{0}\"", msg); return "The synchronous service greets you: " + msg; } // This asynchronously implemented operation is never called because // there is a synchronous version of the same method. public IAsyncResult BeginSampleMethod(string msg, AsyncCallback callback, object asyncState) { Console.WriteLine("BeginSampleMethod called with: " + msg); return new CompletedAsyncResult<string>(msg); } public string EndSampleMethod(IAsyncResult r) { CompletedAsyncResult<string> result = r as CompletedAsyncResult<string>; Console.WriteLine("EndSampleMethod called with: " + result.Data); return result.Data; } public IAsyncResult BeginServiceAsyncMethod(string msg, AsyncCallback callback, object asyncState) { Console.WriteLine("BeginServiceAsyncMethod called with: \"{0}\"", msg); return new CompletedAsyncResult<string>(msg); } public string EndServiceAsyncMethod(IAsyncResult r) { CompletedAsyncResult<string> result = r as CompletedAsyncResult<string>; Console.WriteLine("EndServiceAsyncMethod called with: \"{0}\"", result.Data); return result.Data; } #endregion } // Simple async result implementation. class CompletedAsyncResult<T> : IAsyncResult { T data; public CompletedAsyncResult(T data) { this.data = data; } public T Data { get { return data; } } #region IAsyncResult Members public object AsyncState { get { return (object)data; } } public WaitHandle AsyncWaitHandle { get { throw new Exception("The method or operation is not implemented."); } } public bool CompletedSynchronously { get { return true; } } public bool IsCompleted { get { return true; } } #endregion }}
Imports System.Collections.GenericImports System.ServiceModelImports System.TextImports System.ThreadingNamespace Microsoft.WCF.Documentation <ServiceContractAttribute(Namespace:="http://microsoft.wcf.documentation")> _ Public Interface ISampleService <OperationContractAttribute> _ Function SampleMethod(ByVal msg As String) As String <OperationContractAttribute(AsyncPattern:=True)> _ Function BeginSampleMethod(ByVal msg As String, ByVal callback As AsyncCallback, ByVal asyncState As Object) As IAsyncResult 'Note: There is no OperationContractAttribute for the end method. Function EndSampleMethod(ByVal result As IAsyncResult) As String <OperationContractAttribute(AsyncPattern:=True)> _ Function BeginServiceAsyncMethod(ByVal msg As String, ByVal callback As AsyncCallback, ByVal asyncState As Object) As IAsyncResult ' Note: There is no OperationContractAttribute for the end method. Function EndServiceAsyncMethod(ByVal result As IAsyncResult) As String End Interface Public Class SampleService Implements ISampleService#Region "ISampleService Members" Public Function SampleMethod(ByVal msg As String) As String Implements ISampleService.SampleMethod Console.WriteLine("Called synchronous sample method with ""{0}""", msg) Return "The synchronous service greets you: " & msg End Function ' This asynchronously implemented operation is never called because ' there is a synchronous version of the same method. Public Function BeginSampleMethod(ByVal msg As String, ByVal callback As AsyncCallback, ByVal asyncState As Object) As IAsyncResult Implements ISampleService.BeginSampleMethod Console.WriteLine("BeginSampleMethod called with: " & msg) Return New CompletedAsyncResult(Of String)(msg) End Function Public Function EndSampleMethod(ByVal r As IAsyncResult) As String Implements ISampleService.EndSampleMethod Dim result As CompletedAsyncResult(Of String) = TryCast(r, CompletedAsyncResult(Of String)) Console.WriteLine("EndSampleMethod called with: " & result.Data) Return result.Data End Function Public Function BeginServiceAsyncMethod(ByVal msg As String, ByVal callback As AsyncCallback, ByVal asyncState As Object) As IAsyncResult Implements ISampleService.BeginServiceAsyncMethod Console.WriteLine("BeginServiceAsyncMethod called with: ""{0}""", msg) Return New CompletedAsyncResult(Of String)(msg) End Function Public Function EndServiceAsyncMethod(ByVal r As IAsyncResult) As String Implements ISampleService.EndServiceAsyncMethod Dim result As CompletedAsyncResult(Of String) = TryCast(r, CompletedAsyncResult(Of String)) Console.WriteLine("EndServiceAsyncMethod called with: ""{0}""", result.Data) Return result.Data End Function#End Region End Class ' Simple async result implementation. Friend Class CompletedAsyncResult(Of T) Implements IAsyncResult Private data_Renamed As T Public Sub New(ByVal data As T) Me.data_Renamed = data End Sub Public ReadOnly Property Data() As T Get Return data_Renamed End Get End Property#Region "IAsyncResult Members" Public ReadOnly Property AsyncState() As Object Implements IAsyncResult.AsyncState Get Return CObj(data_Renamed) End Get End Property Public ReadOnly Property AsyncWaitHandle() As WaitHandle Implements IAsyncResult.AsyncWaitHandle Get Throw New Exception("The method or operation is not implemented.") End Get End Property Public ReadOnly Property CompletedSynchronously() As Boolean Implements IAsyncResult.CompletedSynchronously Get Return True End Get End Property Public ReadOnly Property IsCompleted() As Boolean Implements IAsyncResult.IsCompleted Get Return True End Get End Property#End Region End ClassEnd Namespace

See also

  • Designing Service Contracts
  • Synchronous and Asynchronous Operations
How to: Implement an Asynchronous Service Operation - WCF (2024)
Top Articles
Quantumcloud FAQ
California Salary Laws - What Workers Need to Know
Katie Pavlich Bikini Photos
Gamevault Agent
Hocus Pocus Showtimes Near Harkins Theatres Yuma Palms 14
Free Atm For Emerald Card Near Me
Craigslist Mexico Cancun
Hendersonville (Tennessee) – Travel guide at Wikivoyage
Doby's Funeral Home Obituaries
Vardis Olive Garden (Georgioupolis, Kreta) ✈️ inkl. Flug buchen
Select Truck Greensboro
How To Cut Eelgrass Grounded
Craigslist In Flagstaff
Shasta County Most Wanted 2022
Energy Healing Conference Utah
Testberichte zu E-Bikes & Fahrrädern von PROPHETE.
Aaa Saugus Ma Appointment
Geometry Review Quiz 5 Answer Key
Walgreens Alma School And Dynamite
Bible Gateway passage: Revelation 3 - New Living Translation
Home
Shadbase Get Out Of Jail
Gina Wilson Angle Addition Postulate
Celina Powell Lil Meech Video: A Controversial Encounter Shakes Social Media - Video Reddit Trend
Walmart Pharmacy Near Me Open
Dmv In Anoka
A Christmas Horse - Alison Senxation
Ou Football Brainiacs
Access a Shared Resource | Computing for Arts + Sciences
Umn Biology
Obituaries, 2001 | El Paso County, TXGenWeb
Cvs Sport Physicals
Mercedes W204 Belt Diagram
Rogold Extension
'Conan Exiles' 3.0 Guide: How To Unlock Spells And Sorcery
Colin Donnell Lpsg
Teenbeautyfitness
Weekly Math Review Q4 3
Facebook Marketplace Marrero La
Nobodyhome.tv Reddit
Topos De Bolos Engraçados
Gregory (Five Nights at Freddy's)
Grand Valley State University Library Hours
Holzer Athena Portal
Hampton In And Suites Near Me
Stoughton Commuter Rail Schedule
Bedbathandbeyond Flemington Nj
Free Carnival-themed Google Slides & PowerPoint templates
Otter Bustr
Used Curio Cabinets For Sale Near Me
San Pedro Sula To Miami Google Flights
Selly Medaline
Latest Posts
Article information

Author: Msgr. Refugio Daniel

Last Updated:

Views: 5759

Rating: 4.3 / 5 (54 voted)

Reviews: 93% of readers found this page helpful

Author information

Name: Msgr. Refugio Daniel

Birthday: 1999-09-15

Address: 8416 Beatty Center, Derekfort, VA 72092-0500

Phone: +6838967160603

Job: Mining Executive

Hobby: Woodworking, Knitting, Fishing, Coffee roasting, Kayaking, Horseback riding, Kite flying

Introduction: My name is Msgr. Refugio Daniel, I am a fine, precious, encouraging, calm, glamorous, vivacious, friendly person who loves writing and wants to share my knowledge and understanding with you.