如何:异步调用远程对象的方法

本主题介绍一项传统技术,保留该技术是为了向后兼容现有的应用程序,不建议对新的开发使用该技术。现在应该使用  Windows Communication Foundation (WCF) 来开发分布式应用程序。

异步编程的过程与单个应用程序域中的编程过程一样简单。

异步调用远程对象的方法

  1. 创建可接收远程方法调用的对象的实例。

    Dim obj as ServiceClass = new ServiceClass()
    
    ServiceClass obj = new ServiceClass();
    
  2. AsyncCallback 对象来包装回调方法。

    Dim RemoteCallback As New AsyncCallback(AddressOf Me.OurRemoteAsyncCallback)
    
    AsyncCallback RemoteCallback = new AsyncCallback(this.OurRemoteAsyncCallback);
    
  3. 用适当的委托来包装要异步调用的远程方法。

    Delegate Function RemoteAsyncDelegate() As String
    Dim RemoteDel As New RemoteAsyncDelegate(AddressOf obj.RemoteMethod)
    
    public delegate string RemoteAsyncDelegate();
    RemoteAsyncDelegate RemoteDel = new RemoteAsyncDelegate(obj.RemoteMethod);
    
  4. 在第二个委托上调用 BeginInvoke 方法,传递任意参数、AsyncDelegate 以及用于保存状态的某个对象(或者是 null 引用 - 在 Visual Basic 中是 Nothing)。

    Dim RemAr As IAsyncResult = RemoteDel.BeginInvoke(RemoteCallback, Nothing)
    
    IAsyncResult RemAr = RemoteDel.BeginInvoke(RemoteCallback, null);
    
  5. 等待远程对象调用您的回调方法。

    这是常规方法,您可以进行一定程度的调整。如果您希望随时等待特定的调用返回,只需采用从 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。有关此类等待的示例,请参见远程处理示例:异步远程处理中的源代码注释。

另请参见

概念

远程处理示例:异步远程处理
远程应用程序的配置

其他资源

.NET Framework 远程处理概述

生成日期:2010-02-13