如何:异步调用远程对象的方法
本主题介绍一项传统技术,保留该技术是为了向后兼容现有的应用程序,不建议对新的开发使用该技术。现在应该使用 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