AsyncResult-Klasse
Kapselt die Ergebnisse einer asynchronen Operation für einen asynchronen Delegaten.
Namespace: System.Runtime.Remoting.Messaging
Assembly: mscorlib (in mscorlib.dll)
Syntax
'Declaration
<ComVisibleAttribute(True)> _
Public Class AsyncResult
Implements IAsyncResult, IMessageSink
'Usage
Dim instance As AsyncResult
[ComVisibleAttribute(true)]
public class AsyncResult : IAsyncResult, IMessageSink
[ComVisibleAttribute(true)]
public ref class AsyncResult : IAsyncResult, IMessageSink
/** @attribute ComVisibleAttribute(true) */
public class AsyncResult implements IAsyncResult, IMessageSink
ComVisibleAttribute(true)
public class AsyncResult implements IAsyncResult, IMessageSink
Hinweise
Die AsyncResult-Klasse wird in Verbindung mit asynchronen Delegaten verwendet. Das von der BeginInvoke-Methode des Delegaten zurückgegebene IAsyncResult kann in ein AsyncResult umgewandelt werden. Das AsyncResult besitzt die AsyncDelegate-Eigenschaft, die das Delegatobjekt enthält, für das der asynchrone Aufruf ausgelöst wurde.
Weitere Informationen über BeginInvoke sowie über asynchrone Delegaten finden Sie unter Asynchrone Programmierung mithilfe von Delegaten.
Beispiel
Im folgenden Codebeispiel wird die Verwendung der AsyncResult-Klasse zum Abrufen der Ergebnisse einer asynchronen Operation für einen asynchronen Delegaten veranschaulicht.
Imports System
Imports System.Threading
Imports System.Runtime.Remoting
Imports System.Runtime.Remoting.Contexts
Imports System.Runtime.Remoting.Messaging
' Context-bound type with the Synchronization context attribute.
<Synchronization()> Public Class SampleSyncronized
Inherits ContextBoundObject
' A method that does some work, and returns the square of the given number.
Public Function Square(i As Integer) As Integer
Console.Write("The hash of the thread executing ")
Console.WriteLine("SampleSyncronized.Square is: {0}", Thread.CurrentThread.GetHashCode())
Return i * i
End Function 'Square
End Class 'SampleSyncronized
' The async delegate used to call a method with this signature asynchronously.
Delegate Function SampSyncSqrDelegate(i As Integer) As Integer
Public Class AsyncResultSample
' Asynchronous Callback method.
Public Shared Sub MyCallback(ar As IAsyncResult)
' Obtains the last parameter of the delegate call.
Dim value As Integer = Convert.ToInt32(ar.AsyncState)
' Obtains return value from the delegate call using EndInvoke.
Dim aResult As AsyncResult = CType(ar, AsyncResult)
Dim temp As SampSyncSqrDelegate = CType(aResult.AsyncDelegate, SampSyncSqrDelegate)
Dim result As Integer = temp.EndInvoke(ar)
Console.Write("Simple.SomeMethod (AsyncCallback): Result of ")
Console.WriteLine("{0} in SampleSynchronized.Square is {1} ", value, result)
End Sub 'MyCallback
Public Shared Sub Main()
Dim result As Integer
Dim param As Integer
' Creates an instance of a context-bound type SampleSynchronized.
Dim sampSyncObj As New SampleSyncronized()
' Checks whether the object is a proxy, since it is context-bound.
If RemotingServices.IsTransparentProxy(sampSyncObj) Then
Console.WriteLine("sampSyncObj is a proxy.")
Else
Console.WriteLine("sampSyncObj is NOT a proxy.")
End If
param = 10
Console.WriteLine("")
Console.WriteLine("Making a synchronous call on the context-bound object:")
result = sampSyncObj.Square(param)
Console.Write("The result of calling sampSyncObj.Square with ")
Console.WriteLine("{0} is {1}.", param, result)
Console.WriteLine("")
Dim sampleDelegate As New SampSyncSqrDelegate(AddressOf sampSyncObj.Square)
param = 8
Console.WriteLine("Making a single asynchronous call on the context-bound object:")
Dim ar1 As IAsyncResult = sampleDelegate.BeginInvoke(param, New AsyncCallback(AddressOf AsyncResultSample.MyCallback), param)
Console.WriteLine("Waiting for the asynchronous call to complete...")
Dim wh As WaitHandle = ar1.AsyncWaitHandle
wh.WaitOne()
Console.WriteLine("")
Console.WriteLine("Waiting for the AsyncCallback to complete...")
Thread.Sleep(1000)
End Sub 'Main
End Class 'AsyncResultSample
using System;
using System.Threading;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Contexts;
using System.Runtime.Remoting.Messaging;
// Context-bound type with the Synchronization context attribute.
[Synchronization()]
public class SampleSyncronized : ContextBoundObject {
// A method that does some work, and returns the square of the given number.
public int Square(int i) {
Console.Write("The hash of the thread executing ");
Console.WriteLine("SampleSyncronized.Square is: {0}",
Thread.CurrentThread.GetHashCode());
return i*i;
}
}
// The async delegate used to call a method with this signature asynchronously.
public delegate int SampSyncSqrDelegate(int i);
public class AsyncResultSample {
// Asynchronous Callback method.
public static void MyCallback(IAsyncResult ar) {
// Obtains the last parameter of the delegate call.
int value = Convert.ToInt32(ar.AsyncState);
// Obtains return value from the delegate call using EndInvoke.
AsyncResult aResult = (AsyncResult)ar;
SampSyncSqrDelegate temp = (SampSyncSqrDelegate)aResult.AsyncDelegate;
int result = temp.EndInvoke(ar);
Console.Write("Simple.SomeMethod (AsyncCallback): Result of ");
Console.WriteLine("{0} in SampleSynchronized.Square is {1} ", value, result);
}
public static void Main() {
int result;
int param;
// Creates an instance of a context-bound type SampleSynchronized.
SampleSyncronized sampSyncObj = new SampleSyncronized();
// Checks whether the object is a proxy, since it is context-bound.
if (RemotingServices.IsTransparentProxy(sampSyncObj))
Console.WriteLine("sampSyncObj is a proxy.");
else
Console.WriteLine("sampSyncObj is NOT a proxy.");
param = 10;
Console.WriteLine("");
Console.WriteLine("Making a synchronous call on the context-bound object:");
result = sampSyncObj.Square(param);
Console.Write("The result of calling sampSyncObj.Square with ");
Console.WriteLine("{0} is {1}.", param, result);
Console.WriteLine("");
SampSyncSqrDelegate sampleDelegate = new SampSyncSqrDelegate(sampSyncObj.Square);
param = 8;
Console.WriteLine("Making a single asynchronous call on the context-bound object:");
IAsyncResult ar1 = sampleDelegate.BeginInvoke( param,
new AsyncCallback(AsyncResultSample.MyCallback),
param);
Console.WriteLine("Waiting for the asynchronous call to complete...");
WaitHandle wh = ar1.AsyncWaitHandle;
wh.WaitOne();
Console.WriteLine("");
Console.WriteLine("Waiting for the AsyncCallback to complete...");
Thread.Sleep(1000);
}
}
using namespace System;
using namespace System::Threading;
using namespace System::Runtime::Remoting;
using namespace System::Runtime::Remoting::Contexts;
using namespace System::Runtime::Remoting::Messaging;
// Context-bound type with the Synchronization context attribute.
[Synchronization]
public ref class SampleSyncronized: public ContextBoundObject
{
public:
// A method that does some work, and returns the square of the given number.
int Square( int i )
{
Console::Write( "The hash of the thread executing " );
Console::WriteLine( "SampleSyncronized::Square is: {0}", Thread::CurrentThread->GetHashCode() );
return i * i;
}
};
// The async delegate used to call a method with this signature asynchronously.
int i );
public ref class AsyncResultSample
{
public:
// Asynchronous Callback method.
static void MyCallback( IAsyncResult^ ar )
{
// Obtains the last parameter of the delegate call.
int value = Convert::ToInt32( ar->AsyncState );
// Obtains return value from the delegate call using EndInvoke.
AsyncResult^ aResult = dynamic_cast<AsyncResult^>(ar);
SampSyncSqrDelegate^ temp = static_cast<SampSyncSqrDelegate^>(aResult->AsyncDelegate);
int result = temp->EndInvoke( ar );
Console::Write( "Simple::SomeMethod (AsyncCallback): Result of " );
Console::WriteLine( " {0} in SampleSynchronized::Square is {1} ", value, result );
}
};
int main()
{
int result;
int param;
// Creates an instance of a context-bound type SampleSynchronized.
SampleSyncronized^ sampSyncObj = gcnew SampleSyncronized;
// Checks whether the Object* is a proxy, since it is context-bound.
if ( RemotingServices::IsTransparentProxy( sampSyncObj ) )
Console::WriteLine( "sampSyncObj is a proxy." );
else
Console::WriteLine( "sampSyncObj is NOT a proxy." );
param = 10;
Console::WriteLine( "" );
Console::WriteLine( "Making a synchronous call on the context-bound Object*:" );
result = sampSyncObj->Square( param );
Console::Write( "The result of calling sampSyncObj.Square with " );
Console::WriteLine( " {0} is {1}.", param, result );
Console::WriteLine( "" );
SampSyncSqrDelegate^ sampleDelegate = gcnew SampSyncSqrDelegate( sampSyncObj, &SampleSyncronized::Square );
param = 8;
Console::WriteLine( "Making a single asynchronous call on the context-bound Object*:" );
IAsyncResult^ ar1 = sampleDelegate->BeginInvoke( param, gcnew AsyncCallback( AsyncResultSample::MyCallback ), param );
Console::WriteLine( "Waiting for the asynchronous call to complete..." );
WaitHandle^ wh = ar1->AsyncWaitHandle;
wh->WaitOne();
Console::WriteLine( "" );
Console::WriteLine( "Waiting for the AsyncCallback to complete..." );
Thread::Sleep( 1000 );
return 0;
}
import System.*;
import System.Threading.*;
import System.Runtime.Remoting.*;
import System.Runtime.Remoting.Contexts.*;
import System.Runtime.Remoting.Messaging.*;
// Context-bound type with the Synchronization context attribute.
/** @attribute Synchronization()
*/
public class SampleSyncronized extends ContextBoundObject
{
// A method that does some work, and returns the square of the given number.
public int Square(int i)
{
Console.Write("The hash of the thread executing ");
Console.WriteLine("SampleSyncronized.Square is: {0}",
(Int32)System.Threading.Thread.get_CurrentThread().GetHashCode());
return i * i;
} //Square
} //SampleSyncronized
// The async delegate used to call a method with this signature asynchronously.
/** @delegate
*/
public delegate int SampSyncSqrDelegate(int i);
public class AsyncResultSample
{
static int value;
// Asynchronous Callback method.
public static void MyCallback(IAsyncResult ar)
{
// Obtains the last parameter of the delegate call.
SampSyncSqrDelegate sampDelg = (SampSyncSqrDelegate)ar.get_AsyncState();
// Obtains return value from the delegate call using EndInvoke.
AsyncResult aResult = (AsyncResult)ar;
SampSyncSqrDelegate temp =
(SampSyncSqrDelegate)(aResult.get_AsyncDelegate());
int threadId = AppDomain.GetCurrentThreadId();
int result = temp.EndInvoke(ar);
Console.Write("Simple.SomeMethod (AsyncCallback): Result of ");
Console.WriteLine("{0} in SampleSynchronized.Square is {1} ",
(Int32)value, (Int32)result);
} //MyCallback
public static void main(String[] args)
{
int result;
int param;
// Creates an instance of a context-bound type SampleSynchronized.
SampleSyncronized sampSyncObj = new SampleSyncronized();
// Checks whether the object is a proxy, since it is context-bound.
if (RemotingServices.IsTransparentProxy(sampSyncObj)) {
Console.WriteLine("sampSyncObj is a proxy.");
}
else {
Console.WriteLine("sampSyncObj is NOT a proxy.");
}
param = 10;
Console.WriteLine("");
Console.WriteLine("Making a synchronous call on the context-bound "
+ "object:");
result = sampSyncObj.Square(param);
Console.Write("The result of calling sampSyncObj.Square with ");
Console.WriteLine("{0} is {1}.", (Int32)param, (Int32)result);
Console.WriteLine("");
SampSyncSqrDelegate sampleDelegate =
new SampSyncSqrDelegate(sampSyncObj.Square);
param = 8;
value = param;
Console.WriteLine("Making a single asynchronous call on the "
+ "context-bound object:");
IAsyncResult ar1 = sampleDelegate.BeginInvoke(param,
new AsyncCallback(AsyncResultSample.MyCallback), sampleDelegate);
Console.WriteLine("Waiting for the asynchronous call to complete...");
WaitHandle wh = ar1.get_AsyncWaitHandle();
wh.WaitOne();
Console.WriteLine("");
Console.WriteLine("Waiting for the AsyncCallback to complete...");
System.Threading.Thread.Sleep(1000);
} //main
} //AsyncResultSample
Vererbungshierarchie
System.Object
System.Runtime.Remoting.Messaging.AsyncResult
Threadsicherheit
Alle öffentlichen statischen (Shared in Visual Basic) Member dieses Typs sind threadsicher. Bei Instanzmembern ist die Threadsicherheit nicht gewährleistet.
Plattformen
Windows 98, Windows 2000 SP4, Windows Millennium Edition, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
.NET Framework unterstützt nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen.
Versionsinformationen
.NET Framework
Unterstützt in: 2.0, 1.1, 1.0
Siehe auch
Referenz
AsyncResult-Member
System.Runtime.Remoting.Messaging-Namespace