방법: 비동기적으로 원격 개체 메서드 호출
이 항목은 이전 버전의 기존 응용 프로그램과의 호환성을 위해 유지되고 있으나 새로운 개발에는 권장되지 않는 레거시 기술에 대해 설명합니다. 분산 응용 프로그램은 이제 WCF(Windows Communication Foundation)를 사용하여 개발됩니다.
비동기 프로그래밍 프로세스는 단일 응용 프로그램 도메인의 경우처럼 비교적 간단합니다.
비동기적으로 원격 개체의 메서드를 호출하려면
메서드에 대한 원격 호출을 받을 수 있는 개체 인스턴스를 만듭니다.
Dim obj as ServiceClass = new ServiceClass()
ServiceClass obj = new ServiceClass();
콜백 메서드를 AsyncCallback 개체로 래핑합니다.
Dim RemoteCallback As New AsyncCallback(AddressOf Me.OurRemoteAsyncCallback)
AsyncCallback RemoteCallback = new AsyncCallback(this.OurRemoteAsyncCallback);
비동기적으로 호출할 원격 메서드를 적절한 대리자로 래핑합니다.
Delegate Function RemoteAsyncDelegate() As String Dim RemoteDel As New RemoteAsyncDelegate(AddressOf obj.RemoteMethod)
public delegate string RemoteAsyncDelegate(); RemoteAsyncDelegate RemoteDel = new RemoteAsyncDelegate(obj.RemoteMethod);
두 번째 대리자에 대해 BeginInvoke 메서드를 호출하여 모든 인수, AsyncDelegate 및 상태(또는 null 참조, Visual Basic의 경우에는 Nothing)를 저장할 일부 개체를 전달합니다.
Dim RemAr As IAsyncResult = RemoteDel.BeginInvoke(RemoteCallback, Nothing)
IAsyncResult RemAr = RemoteDel.BeginInvoke(RemoteCallback, null);
원격 개체가 콜백 메서드를 호출할 때까지 대기합니다.
이것이 일반적인 방법이지만 어느 정도까지 방법을 변경할 수 있습니다. 임의의 시점에서 특정 호출이 반환될 때까지 대기하려면 다음 코드 예제와 같이 BeginInvoke 호출에서 반환된 IAsyncResult 인터페이스를 사용하고 해당 개체의 WaitHandle 인스턴스를 검색한 다음 WaitOne 메서드를 호출하면 됩니다.
RemAr.AsyncWaitHandle.WaitOne()
RemAr.AsyncWaitHandle.WaitOne();
또는 다음 샘플 코드와 같이 호출이 완료되었는지 여부를 확인하는 루프에서 대기할 수도 있습니다.
Dim count As Integer = 0 While Not RemAr.IsCompleted Console.Write("Not completed -- " & count & vbCr) count += 1 Thread.Sleep(New TimeSpan(TimeSpan.TicksPerMillisecond)) End While
int count = 0; while (!RemAr.IsCompleted) { Console.Write("\rNot completed: " + (++count).ToString()); Thread.Sleep(1); }
마지막으로 주 스레드에서 ManualResetEvent를 만들고 콜백 함수에서 대기할 수 있습니다. 이 함수는 반환하기 전 마지막 줄로 ManualResetEvent를 알립니다. 이 대기 유형의 예는 원격 서비스 예제: 비동기 원격 서비스의 소스 코드 설명을 참조하십시오.
참고 항목
개념
원격 서비스 예제: 비동기 원격 서비스
원격 응용 프로그램 구성
관련 자료
빌드 날짜: 2010-02-13