Практическое руководство. Асинхронный вызов методов удаленного объекта
Этот раздел относится к технологии прежних версий, которая сохраняется для обеспечения обратной совместимости с существующими приложениями и не рекомендуется для разработки новых приложений. Сейчас распределенные приложения следует создавать с помощью 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 (Nothing в Visual Basic).
Dim RemAr As IAsyncResult = RemoteDel.BeginInvoke(RemoteCallback, Nothing)
IAsyncResult RemAr = RemoteDel.BeginInvoke(RemoteCallback, null);
Дождитесь, пока удаленный объект вызовет метод обратного вызова.
Это общий подход, который можно изменять до определенной степени. Если в какой-то момент необходимо дождаться завершения определенного вызова, нужно просто взять интерфейс 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