Procedure: Aanroepen van bewerkingen asynchroon met behulp van een kanaalfactory
In dit onderwerp wordt beschreven hoe een client asynchroon toegang heeft tot een servicebewerking wanneer u een clienttoepassing op basis van een ChannelFactory<TChannel>client gebruikt. (Wanneer u een System.ServiceModel.ClientBase<TChannel> object gebruikt om een service aan te roepen, kunt u het gebeurtenisgestuurde asynchrone aanroepende model gebruiken. Zie Procedure voor meer informatie : Servicebewerkingen asynchroon aanroepen. Zie Asynchroon Asynchroon patroon (EAP) voor meer informatie over het op gebeurtenissen gebaseerde asynchrone aanroepende model.
De service in dit onderwerp implementeert de ICalculator
interface. De client kan de bewerkingen op deze interface asynchroon aanroepen, wat betekent dat bewerkingen zoals Add
worden gesplitst in twee methoden enEndAdd
BeginAdd
, waarvan de eerste de aanroep initieert en waarvan de laatste het resultaat ophaalt wanneer de bewerking is voltooid. Zie Hoe u een Asynchrone servicebewerking implementeert voor een voorbeeld van het asynchroon implementeren van een bewerking in een service. Zie Synchrone en Asynchrone bewerkingen voor meer informatie over synchrone en asynchrone bewerkingen.
Procedure
WCF-servicebewerkingen asynchroon aanroepen
Voer het hulpprogramma ServiceModel Metadata Utility (Svcutil.exe) uit met de
/async
optie, zoals wordt weergegeven in de volgende opdracht.svcutil /n:http://Microsoft.ServiceModel.Samples,Microsoft.ServiceModel.Samples http://localhost:8000/servicemodelsamples/service/mex /a
Hiermee wordt een asynchrone clientversie van het servicecontract voor de bewerking gegenereerd.
Maak een callback-functie die moet worden aangeroepen wanneer de asynchrone bewerking is voltooid, zoals wordt weergegeven in de volgende voorbeeldcode.
static void AddCallback(IAsyncResult ar) { double result = ((CalculatorClient)ar.AsyncState).EndAdd(ar); Console.WriteLine("Add Result: {0}", result); }
Private Shared Sub AddCallback(ByVal ar As IAsyncResult) Dim result = (CType(ar.AsyncState, CalculatorClient)).EndAdd(ar) Console.WriteLine("Add Result: {0}", result) End Sub
Als u asynchroon toegang wilt krijgen tot een servicebewerking, maakt u de client en roept u de
Begin[Operation]
(bijvoorbeeldBeginAdd
) aan en geeft u een callback-functie op, zoals wordt weergegeven in de volgende voorbeeldcode.ChannelFactory<ICalculatorChannel> factory = new ChannelFactory<ICalculatorChannel>(); ICalculatorChannel channelClient = factory.CreateChannel(); // BeginAdd double value1 = 100.00D; double value2 = 15.99D; IAsyncResult arAdd = channelClient.BeginAdd(value1, value2, AddCallback, channelClient); Console.WriteLine("Add({0},{1})", value1, value2);
Dim factory As New ChannelFactory(Of ICalculatorChannel)() Dim channelClient As ICalculatorChannel = factory.CreateChannel() ' BeginAdd Dim value1 = 100.0R Dim value2 = 15.99R Dim arAdd As IAsyncResult = channelClient.BeginAdd(value1, value2, AddressOf AddCallback, channelClient) Console.WriteLine("Add({0},{1})", value1, value2)
Wanneer de callback-functie wordt uitgevoerd, roept
End<operation>
de client aan (bijvoorbeeldEndAdd
) om het resultaat op te halen.
Opmerking
De service die wordt gebruikt met de clientcode die in de voorgaande procedure wordt gebruikt, implementeert de ICalculator
interface, zoals wordt weergegeven in de volgende code. Aan de servicezijde worden de Add
en Subtract
bewerkingen van het contract synchroon aangeroepen door de WCF-uitvoeringstijd (Windows Communication Foundation), ook al worden de voorgaande clientstappen asynchroon aangeroepen op de client. De Multiply
en Divide
bewerkingen worden gebruikt om de service asynchroon aan te roepen aan de servicezijde, zelfs als de client deze synchroon aanroept. In dit voorbeeld wordt de AsyncPattern eigenschap ingesteld op true
. Deze eigenschapsinstelling, in combinatie met de implementatie van het asynchrone .NET Framework-patroon, vertelt de runtime om de bewerking asynchroon aan te roepen.
[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")]
public interface ICalculator
{
[OperationContract]
double Add(double n1, double n2);
[OperationContract]
double Subtract(double n1, double n2);
//Multiply involves some file I/O so we'll make it Async.
[OperationContract(AsyncPattern = true)]
IAsyncResult BeginMultiply(double n1, double n2, AsyncCallback callback, object state);
double EndMultiply(IAsyncResult ar);
//Divide involves some file I/O so we'll make it Async.
[OperationContract(AsyncPattern = true)]
IAsyncResult BeginDivide(double n1, double n2, AsyncCallback callback, object state);
double EndDivide(IAsyncResult ar);
}
<ServiceContract(Namespace:="http://Microsoft.ServiceModel.Samples")> _
Public Interface ICalculator
<OperationContract> _
Function Add(ByVal n1 As Double, ByVal n2 As Double) As Double
<OperationContract> _
Function Subtract(ByVal n1 As Double, ByVal n2 As Double) As Double
'Multiply involves some file I/O so we'll make it Async.
<OperationContract(AsyncPattern:=True)> _
Function BeginMultiply(ByVal n1 As Double, ByVal n2 As Double, ByVal callback As AsyncCallback, ByVal state As Object) As IAsyncResult
Function EndMultiply(ByVal ar As IAsyncResult) As Double
'Divide involves some file I/O so we'll make it Async.
<OperationContract(AsyncPattern:=True)> _
Function BeginDivide(ByVal n1 As Double, ByVal n2 As Double, ByVal callback As AsyncCallback, ByVal state As Object) As IAsyncResult
Function EndDivide(ByVal ar As IAsyncResult) As Double
End Interface