window Form 응용프로그램을 시작하고
웹서비스를 참조하게 되면
해당 프로젝트가 저장되는 폴더의
Web Reference 폴더 아래의 참조 Namesapce명의 폴더 아래
Reference.vb라는 파일이 있다.

이 파일에는 참조하는 웹서비스에 대하여 자동으로 생성된
추가적인 메소드들이 들어있다.

웹서비스 메소는 HelloWord였는대
추가적인 이벤트 HelloWorldCompleted
추가적인 메소드 HelloworldAsync,OnHelloWorldOperationCompleted
가 자동으로 생성되어있다.
HelloWord를 직접 호출하게 되면 동기 호출이 되고
결과가 반환될때까지 실행은 중지상태가 된다.
HelloWorldAsync를 호출하게 되면 비동기 호출이 되며
호출 뒤에 그 다음이 코드가 바로 실행이 되며
웹서버로 HelloWorld메소드에 호출에 대한 응답이 완료되면
HelloWorldOperationCompleted 이벤트가 발생된다.
또 다른 방법으로는
VB.Net에 자동으로 생성되는 코드로
Begin웹메소드명, End웹메소드명으로 생성되는 방식의 코드도 있다.
Begin으로 시작하는 메소드는 비동기 호출을 시작하는것이고
End로 시작하는 메소드는 비동기 호출 작업을 종료하는 것이다.

위 이미지와 같이 Begin,End로 시작하는 메소드가 자동으로 생성되는 방식이라면
비동기 대리자를 사용하여 처리하면 된다.
그러면 HelloWorld에 대한 비동기 호출을 지원하기 위한 VB.Net이 자동으로 생성한 코드로
BeginHelloWorld와 EndHelloWorld가 생성이 되있다고 가정하자.
또한 이런 방식의 코드에는
System 네이스페이스에
비동기 작업 종료시 메소드를 호출하기 위한 AsyncCallback 대리자와
웹메소드가 전달된 값고, 비동기 호출 작업 진행 상태를 알기 위한 IAsyncResult 인터페이스가 필요하다.
코드는 다음과 같다.
Dim Ws As New Test.Test
Dim Cb As New AsyncCallback(AddresOf EndWebService)
dim St As IAsyncResult
St = BeginHelloWorld(Cb,Ws)
Public Sub EndWebService(ByVal ar as IAsyncResult)
dim Ws As Test.Test
Ws=ar.AsyncState
MsgBox(Ws.EndHelloWorld(ar))
End Sub
우선 웹참조한 개체를 선언한다.
Dim Ws As New Test.Test
다음은 비동기로 호출할 작어에 대한 종료 메소드를 호출할 대리자를 선언한다.
Dim Cb As New AsyncCallback(AddresOf EndWebService)
비동기 호출 작업이 종료될때 호출할 메소드는 EndWebService이다.
AsyncCallback 대리자 호출할 메소드는 형식은
Public Sub 메소드명(ByVal ar as IAsyncResult)
ar은 비동기 호출 작업 상태를 얻을수 있다.
다음은 비동기 작업 상태를 확인하기 인터페이스 변수를 하나 선언한다.
dim St As IAsyncResult
이제 준비 단계는 끝났다.
비동기 호출을 해보자.
이전에 말했듯이
비동기 호출을 하기 위해서는 Begin으로 시작하는 메소드를 호출하면 된다.
St = BeginHelloWorld(Cb,Ws)
여기서 인수 마지막에서 두번째는 비동기 작업시 사용할 대리자를 지정하고
마지막에서 첫번째는 비동기 호출 메소드가 포함된 개체를 지정한다.
반환은 비동기 작업 상태를 확인할수 있는 IAsyncResult 인터페이스를 갖는 개체를 반환한다.
비동기 호출이 진행이 되었으니
웹 메소드의 작업이 완료되면
비동기 호출 대리자에 할당한 메소드가 호출이 된다.
그 대리자에서 넘어오는 인수 값도 역시
비동기 작업 상태를 확인할수 있는 IAsyncResult 인터페이스를 갖는 개체를 반환한다.
이 개체에서 AsyncState 속성을 참조하게 되면
비동기 호출 메소드가 포함된 개체를 얻을수 있다.
dim Ws As Test.Test
Ws=ar.AsyncState
마지막으로 비동기 작업을 종료하는 메소드를 호출해주어야 한다.
Ws.EndHelloWorld(ar)
바로 End로 시작하는 메소드를 호출하면 된다.
인수로는 메소드에 전달된 비동기 작업 상태를 나타내는 개체를
지정하면 된다.
반환은 웹메소드 호출 결과를 반환한다.
MsgBox(Ws.EndHelloWorld(ar))
다음은 폼 로드 이벤트에 웹 메소드를 비동기,동기로 호출했을때의 차이이다.
비동기 호출하게 되면 창이 보이고 메세지 박스도 같이 보인다.

그러나 동기 호출하게 되면 메세지 박스가 우선 표시된 후에
확인 버튼을 누른 후에에 비로서 폼이 보인다.
