Практическое руководство. Асинхронный вызов методов удаленного объекта

Этот раздел относится к технологии прежних версий, которая сохраняется для обеспечения обратной совместимости с существующими приложениями и не рекомендуется для разработки новых приложений. Сейчас распределенные приложения следует создавать с помощью  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 (Nothing в Visual Basic).

    Dim RemAr As IAsyncResult = RemoteDel.BeginInvoke(RemoteCallback, Nothing)
    
    IAsyncResult RemAr = RemoteDel.BeginInvoke(RemoteCallback, null);
    
  5. Дождитесь, пока удаленный объект вызовет метод обратного вызова.

    Это общий подход, который можно изменять до определенной степени. Если в какой-то момент необходимо дождаться завершения определенного вызова, нужно просто взять интерфейс IAsyncResult, возвращенный вызовом BeginInvoke, получить для этого объекта экземпляр 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