WCF 서비스, 비동기(Asynchronuos) 호출로 사용하기
.NET/WCF / 2009/10/19 23:24
서비스를 사용할 때 종종 비동기 호출을 사용해야 할 때가 발생한다.
동기적인 호출인 경우엔 클라이언트가 하나의 서비스를 호출했을 때 그 서비스가 끝날 때까지(결과값을 전송받을 때까지) 기다려야 하지만,
클라이언트가 서비스를 비동기적으로 호출했을 때는 서비스가 끝날 때까지 기다릴 필요없이 다른 작업을 진행할 수 있다는 장점이 있다.
WCF에서는 간단하게 서비스를 비동기 호출로 사용할 수 있는 방법을 제공해준다.
이는 서비스에 대한 프록시 클래스를 생성할 때 만들어지는 BeginOperationName 클래스와 EndOperationName 클래스,
그리고 IAsycResult 클래스에 의해 구현된다.
우선, WCF 서비스의 비동기 호출을 위해서는 서비스 참조 추가 시에 "비동기 작업 생성" 옵션을 선택하여 프록시 클래스를 생성하여야 하며, 이는 서비스 참조 추가에서 "고급" 버튼 클릭 후 "비동기 작업 생성" 옵션을 체크하여 수행할 수 있다.
이렇게 하여 만들어진 프록시 클래스를 살펴보면, BeginOperationName, EndOperationName 클래스가 생성된 것을 확인할 수 있다. 이제 이를 이용하여 서비스를 비동기 방식으로 호출하여 보자.
서비스 프록시 클래스의 네임스페이스를 추가하고, 프록시 클래스 인스턴스를 생성한다.
그리고 이 인스턴스를 사용하여 BeginOperationName 클래스를 호출한다.
using AsyncSVCClient.AsyncService;
namespace AsyncSVCClient
{
class Program
{
static void Main(string[] args)
{
// 프록시 클래스 생성
AsyncSVCClient.AsyncService.AsyncClient proxy = new AsyncSVCClient.AsyncService.AsyncClient();
IAsyncResult aresult = proxy.BeginGetData(i, GetDataCallback, proxy); // Operation 호출
...아래 생략...
namespace AsyncSVCClient
{
class Program
{
static void Main(string[] args)
{
// 프록시 클래스 생성
AsyncSVCClient.AsyncService.AsyncClient proxy = new AsyncSVCClient.AsyncService.AsyncClient();
IAsyncResult aresult = proxy.BeginGetData(i, GetDataCallback, proxy); // Operation 호출
...아래 생략...
"BeginGetData" operation 호출시 두번째 인자는 서버에서 모든 작업을 끝낸 후 클라이언트를 호출할 때 사용하는 Callback 메서드이다.
이 Callback 메서드에서는 EndOperationName 클래스를 호출하여 서비스의 결과를 가져온다.
// Async Callback 메서드
static void GetDataCallback(IAsyncResult ar)
{
string result = ((AsyncClient)ar.AsyncState).EndGetData(ar); // EndOperation 호출 -- > 서비스 결과 값 가져오기
Console.WriteLine("Receive Result : {0}", result);
... 아래 생략 ...
static void GetDataCallback(IAsyncResult ar)
{
string result = ((AsyncClient)ar.AsyncState).EndGetData(ar); // EndOperation 호출 -- > 서비스 결과 값 가져오기
Console.WriteLine("Receive Result : {0}", result);
... 아래 생략 ...
정리하고 보니 다시 한번 느끼지만 아~주,, 간단하다. ㅎ
서비스를 만들때는 다른 설정을 해주지 않더라도 서비스 참조를 추가할 때 비동기 호출 옵션만 체크해주면 쉽게 서비스를 비동기적으로 호출해 줄 수 있는 것이다. 이를 이용하면 서비스를 각각의 목적에 맞게, 유용하게 사용할 수 있을 것 같다.