간만에 웹서비스를 써야 해서 WCF파일을 추가하고 서비스 참조를 했는데.....
어라?
이전과 달리 '[메서드이름]Completed'도 안보이고....뭐지?;;;;
예전에 실버라이트에서 한번 다뤘던 거라 이전 글을 확인해도 모양이 이상합니다;;;
(참고 : [Silverlight] 1/4. 한 프로젝트에서 웹서비스 만들기)
서비스는 간단하게 요청이 들어오면 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;
}
}
이전에는 그냥 서비스 참조만 하면 '[메서드이름]Completed'가 생겼는데
이제는 참조할 때 옵션을 지정해야 생깁니다.
서비스 참조 추가 > 고급 > 서비스 참조 설정 > 클라이언트
에서 '비동기 작업 생성'을 체크합니다.
이제 '[메서드이름]Completed'가 보입니다!
이제 이전처럼 '[메서드이름]Completed'에 이벤트를 붙여서 사용할 수 있습니다.
해당 웹서비스 메소드를 호출할 때는 '[메소드이름]Async'를 호출하셔야 합니다.
(비동기 함수)
//시간체크용 타이머
static Stopwatch m_Watch = new Stopwatch();
//웹서비스 객체
UsingAsyncClient m_MesClient = new UsingAsyncClient();
/// <summary>
/// 생성자
/// </summary>
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'에 이벤트만 연결하고 별다른 작업은 하지 않았습니다.
이제 테스트해봅시다.
버튼을 누르고 응답이 오기 전에 창을 이동해 봅시다.
프로그램이 '응답 없음'상태가 됩니다.
메소드 호출은 비동기로 하고 있지만
클릭 이벤트에서 동기로 처리하고 있기 때문입니다.
전체 소스입니다.
버튼1은 데브피아에 '신사웅'님께서 올려주신 'Begin[메서드명]' & 'End[메서드명]' 예제로 만든 동작입니다.
(참고 : 데브피아 싱사웅님 - 프록시 클라이언트 생성시 Async 옵션 사용하기 )
두 방식 다 동일한 동작을 합니다.
비동기로 처리하는 샘플도 만들었어야 했는데....
거기까지 생각을 못 했네요.