HOW TO:以非同步方式呼叫遠端物件的方法
本主題專門說明一項為了在現有應用程式中提供回溯相容性而保留的舊有技術,不建議用於新的開發工作。分散式應用程式應使用 Windows Communication Foundation (WCF) 進行開發。
非同步程式設計的處理序與單一應用程式定義域的處理序一樣直接。
若要以非同步方式呼叫遠端物件的方法
建立物件的執行個體,這個執行個體可以接收方法的遠端呼叫。
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