방법: 콜백 기술을 사용하여 비동기 웹 서비스 클라이언트 구현
이 항목은 레거시 기술과 관련된 것입니다. 이제 XML Web services와 XML Web services 클라이언트는 다음을 사용하여 만들어야 합니다. Windows Communication Foundation.
콜백 기술은 웹 서비스 메서드와 비동기적으로 통신하기 위해 웹 서비스 클라이언트를 구현하는 한 방법으로, 메서드가 동기 액세스용인 경우에도 마찬가지입니다. 이 기술에 대한 자세한 내용은 XML Web Services와 비동기적으로 통신 항목을 참조하십시오.
이 예제는 Factorize 메서드를 사용하는 PrimeFactorizer 웹 서비스 클래스를 기반으로 하며, Wsdl.exe 도구는 BeginFactorize와 EndFactorize의 두 가지 비동기 클라이언트 프록시 메서드를 생성합니다.
콜백 기술을 구현하려면
AsyncCallback 대리자를 구현하는 콜백 함수를 정의합니다.
public static void FactorizeCallback(IAsyncResult ar)
Public Shared Sub FactorizeCallback(ar As IAsyncResult)
AsyncCallback 대리자를 인스턴스화합니다.
AsyncCallback cb = new AsyncCallback(TestCallback.FactorizeCallback);
Dim cb as AsyncCallback cb = new AsyncCallback(AddressOf TestCallback.FactorizeCallback)
콜백 함수를 두 번째 인수로 전달하고 상태를 제공하는 개체(이 예제의 경우 PrimeFactorizer의 클라이언트 구현)를 세 번째 인수로 전달하여 Begin 메서드를 호출합니다.
IAsyncResult ar = pf.BeginFactorize(factorizableNum, cb, pf);
Dim ar As IAsyncResult = pf.BeginFactorize(factorizableNum, _ cb, pf)
Begin 메서드가 반환하는 IAsyncResult에서 IsCompleted 속성을 확인합니다. 클라이언트가 서버로부터 응답을 받으면 값이 true로 설정됩니다.
콜백 함수에서 상태 개체에 액세스합니다. IAsyncState 매개 변수의 AsyncState 속성에는 Begin 메서드에 세 번째 매개 변수로 전달된 개체가 있습니다.
PrimeFactorizer pf = (PrimeFactorizer) ar.AsyncState;
Dim pf As PrimeFactorizer = ar.AsyncState
콜백 함수 내에서, 이전 단계에서 가져온 상태 개체에 대해 End 메서드를 호출합니다.
long[] results = pf.EndFactorize(ar);
Dim results() as Long results = pf.EndFactorize(ar)
예제
using System;
using System.Runtime.Remoting.Messaging;
using MyFactorize;
class TestCallback
{
public static void Main(){
long factorizableNum = 12345;
PrimeFactorizer pf = new PrimeFactorizer();
//Instantiate an AsyncCallback delegate to use as a parameter
//in the BeginFactorize method.
AsyncCallback cb = new AsyncCallback(TestCallback.FactorizeCallback);
// Begin the Async call to Factorize, passing in our
// AsyncCalback delegate and a reference
// to our instance of PrimeFactorizer.
IAsyncResult ar = pf.BeginFactorize(factorizableNum, cb, pf);
// Keep track of the time it takes to complete the async call
// as the call proceeds.
int start = DateTime.Now.Second;
int currentSecond = start;
while (!ar.IsCompleted){
if (currentSecond < DateTime.Now.Second) {
currentSecond = DateTime.Now.Second;
Console.WriteLine("Seconds Elapsed..." + (currentSecond - start).ToString() );
}
}
// Once the call has completed, you need a method to ensure the
// thread executing this Main function
// doesn't complete prior to the call-back function completing.
Console.Write("Press Enter to quit");
int quitchar = Console.Read();
}
// Set up a call-back function that is invoked by the proxy class
// when the asynchronous operation completes.
public static void FactorizeCallback(IAsyncResult ar)
{
// You passed in our instance of PrimeFactorizer in the third
// parameter to BeginFactorize, which is accessible in the
// AsyncState property.
PrimeFactorizer pf = (PrimeFactorizer) ar.AsyncState;
long[] results;
// Get the completed results.
results = pf.EndFactorize(ar);
//Output the results.
Console.Write("12345 factors into: ");
int j;
for (j = 0; j<results.Length;j++){
if (j == results.Length - 1)
Console.WriteLine(results[j]);
else
Console.Write(results[j] + ", ");
}
}
}
Imports System
Imports System.Runtime.Remoting.Messaging
Imports MyFactorize
Public Class TestCallback
Public Shared Sub Main()
Dim factorizableNum As Long = 12345
Dim pf As PrimeFactorizer = new PrimeFactorizer()
'Instantiate an AsyncCallback delegate to use as a
'parameter
' in the BeginFactorize method.
Dim cb as AsyncCallback
cb = new AsyncCallback(AddressOf TestCallback.FactorizeCallback)
' Begin the Async call to Factorize, passing in the
' AsyncCallback delegate and a reference to our instance
' of PrimeFactorizer.
Dim ar As IAsyncResult = pf.BeginFactorize(factorizableNum, _
cb, pf)
' Keep track of the time it takes to complete the async call as
' the call proceeds.
Dim start As Integer = DateTime.Now.Second
Dim currentSecond As Integer = start
Do while (ar.IsCompleted = false)
If (currentSecond < DateTime.Now.Second) Then
currentSecond = DateTime.Now.Second
Console.WriteLine("Seconds Elapsed..." +
(currentSecond - start).ToString() )
End If
Loop
' Once the call has completed, you need a method to ensure the
' thread executing this Main function
' doesn't complete prior to the callback function completing.
Console.Write("Press Enter to quit")
Dim quitchar As Integer = Console.Read()
End Sub
' Set up the call-back function that is invoked by the proxy
' class when the asynchronous operation completes.
Public Shared Sub FactorizeCallback(ar As IAsyncResult)
' You passed in the instance of PrimeFactorizer in the third
' parameter to BeginFactorize, which is accessible in the
' AsyncState property.
Dim pf As PrimeFactorizer = ar.AsyncState
Dim results() as Long
' Get the completed results.
results = pf.EndFactorize(ar)
'Output the results.
Console.Write("12345 factors into: ")
Dim j as Integer
For j = 0 To results.Length - 1
If j = (results.Length - 1) Then
Console.WriteLine(results(j) )
Else
Console.Write(results(j).ToString + ", ")
End If
Next j
End Sub
End Class
참고 항목
작업
방법: 대기 기술을 사용하여 비동기 웹 서비스 클라이언트 구현
방법: 웹 서비스 클라이언트에서 비동기 호출 수행
개념
XML Web services와 비동기적으로 통신
XML Web services 클라이언트 빌드