方法 : リモート オブジェクトのメソッドを非同期で呼び出す
このトピックの対象は、既存のアプリケーションとの下位互換性のために残されているレガシ テクノロジに特定されています。新規の開発には、このトピックを適用しないでください。分散アプリケーションは、現在は 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);
2 つ目のデリゲートで、任意の引数、AsyncDelegate、および状態を保持するオブジェクト (または、Visual Basic では null 参照 Nothing) を渡して BeginInvoke メソッドを呼び出します。
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