간만에 웹서비스를 써야 되서 WCF파일을 추가하고 서비스 참조를 했는데.....

 

어라?

이전과 달리 '[메서드이름]Completed'도 안보이고 멍미;;;;

 

 

 

예전에 실버라이트에서 한번 다뤘던거라 이전글을 확인해도 모양이 이상합니다;;;

(참고 : [Silverlight] 1/4. 한 프로젝트에서 웹서비스 만들기)

 

어찌어찌 겨우 다시 찾았으니 정리해 둡니다 ㅎㅎㅎ

 

 

1. 테스트 WCF 서비스 만들기

 

서비스는 간단하게 요청이 들어오면 5초대기를 한후 받은 값에 문자열을 더해 리턴해주는 형식입니다.

 

[ServiceContract]
public interface IUsingAsync
{
	[OperationContract]
	string GetName(string name);
}

public class UsingAsync : IUsingAsync
{
	public string GetName(string name)
	{
		Thread.Sleep(5000);
		return "Name is " + name;
	}

}

 

2. 서비스 참조하기

이전에는 그냥 서비스참조만 하면 '[메서드이름]Completed'가 생겼는데 이제는 참조할때 옵션을 지정해야 생깁니다.

 

서비스 참조 추가 > 고급 > 서비스 참조 설정 > 클라이언트

에서 '비동기 작업 생성' 을 체크 합니다.

 

 

이제 '[메서드이름]Completed'가 보입니다!

 

 

야호!!!

 

 

 

 

 

 

3. 비동기 클라이언트 만들기

이제 이전 처럼 '[메서드이름]Completed'에 이벤트를 붙여서 사용할수 있습니다.

해당 웹서비스 메소드를 호출할때는 '[메소드이름]Async'를 호출 하셔야 합니다.

 

//시간체크용 타이머
static Stopwatch m_Watch = new Stopwatch();
//웹서비스 객체
UsingAsyncClient m_MesClient = new UsingAsyncClient();

/// 
/// 생성자
/// 
public Form1()
{
	InitializeComponent();

	//이벤트 연결
	m_MesClient.GetNameCompleted += client_GetNameCompleted;
}

void client_GetNameCompleted(object sender, GetNameCompletedEventArgs e)
{
	string str = e.Result;

	//http://blog.danggun.net/2040
	this.Invoke(new MethodInvoker(
		delegate()
		{

			listBox1.Items.Add(string.Format("{0} [{1} ms]", str, m_Watch.ElapsedMilliseconds));
		}));
}

 

 

이전과 똑같이 '[메서드이름]Completed'에 이벤트만 연결하고 별다른 작업은 하지 않았습니다.

 

 

4. 테스트

이제 테스트를 해봅시다.

 

 

버튼을 누르고 응답이 오기전에 창을 이동해 봅시다.

비동기 상태에서는 창이 이동되지 않습니다.

 

 

마무리

전체 소스 입니다.

 

WcfService1.zip

 

WindowsFormsApplication1.zip

 

버튼1은 데비피아에 신사웅 님께서 올려주신 'Begin[메서드명]' & 'End[메서드명]' 예제로 만든 동작입니다.

(참고 : 데브피아 싱사웅님 - 프록시 클라이언트 생성시 Async 옵션 사용하기 )

 

두방식다 동일한 동작을 합니다.

 

 

 



 

댓글 작성

이름
패스워드
홈페이지
비밀글