다음을 통해 공유


IAsyncResult 인터페이스

비동기 작업의 상태를 나타냅니다.

네임스페이스: System
어셈블리: mscorlib(mscorlib.dll)

구문

‘선언
<ComVisibleAttribute(True)> _
Public Interface IAsyncResult
‘사용 방법
Dim instance As IAsyncResult
[ComVisibleAttribute(true)] 
public interface IAsyncResult
[ComVisibleAttribute(true)] 
public interface class IAsyncResult
/** @attribute ComVisibleAttribute(true) */ 
public interface IAsyncResult
ComVisibleAttribute(true) 
public interface IAsyncResult

설명

IAsyncResult 인터페이스는 비동기적으로 작동할 수 있는 메서드가 들어 있는 클래스에서 구현됩니다. 이 인터페이스는 FileStream.BeginRead와 같이 비동기 작업을 초기화하는 메서드의 반환 형식이며, FileStream.EndRead와 같이 비동기 작업을 끝내는 메서드의 세 번째 매개 변수 형식을 갖습니다. IAsyncResult 개체도 비동기 작업이 끝날 때 AsyncCallback 대리자에서 호출한 메서드로 전달됩니다.

IAsyncResult 인터페이스를 지원하는 개체는 비동기 작업에 대한 상태 정보를 저장하며, 작업이 완료될 때 스레드에게 신호를 보낼 수 있는 동기화 개체를 제공합니다.

IAsyncResult 인터페이스 사용 방법에 대한 자세한 내용은 동기 메서드를 비동기 방식으로 호출 항목을 참조하십시오.

예제

다음 샘플에서는 IAsyncResult를 사용하여 비동기 작업의 반환 값을 가져오는 방법을 보여 줍니다.

' 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  
// 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);
}
// 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 );
}
// 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

다음 샘플에서는 비동기 작업이 끝나기를 기다리는 경우를 보여 줍니다.

Imports System
Imports System.Threading
Imports System.Runtime.Remoting
Imports System.Runtime.Remoting.Contexts
Imports System.Runtime.Remoting.Messaging


'
' Context-Bound type with Synchronization Context Attribute
'
<Synchronization()> Public Class SampleSyncronized
   Inherits ContextBoundObject
   
   ' A method that does some work - returns the square of the given number
   Public Function Square(i As Integer) As Integer
      Console.Write("SampleSyncronized.Square called.  ")
      Console.WriteLine("The hash of the current thread is: {0}", Thread.CurrentThread.GetHashCode())
      Return i * i
   End Function 'Square
End Class 'SampleSyncronized



'
' Async delegate used to call a method with this signature asynchronously
'
Delegate Function SampSyncSqrDelegate(i As Integer) As Integer


'Main sample class
Public Class AsyncResultSample
   
   Public Shared Sub Main()
      Dim callParameter As Integer = 0
      Dim callResult As Integer = 0
      
      'Create an instance of a context-bound type SampleSynchronized
      'Because SampleSynchronized is context-bound, the object sampSyncObj 
      'is a transparent proxy
      Dim sampSyncObj As New SampleSyncronized()
      
      
      'call the method synchronously
      Console.Write("Making a synchronous call on the object.  ")
      Console.WriteLine("The hash of the current thread is: {0}", Thread.CurrentThread.GetHashCode())
      callParameter = 10
      callResult = sampSyncObj.Square(callParameter)
      Console.WriteLine("Result of calling sampSyncObj.Square with {0} is {1}.", callParameter, callResult)
      Console.WriteLine("")
      Console.WriteLine("")
      
      
      'call the method asynchronously
      Console.Write("Making an asynchronous call on the object.  ")
      Console.WriteLine("The hash of the current thread is: {0}", Thread.CurrentThread.GetHashCode())
      Dim sampleDelegate As New SampSyncSqrDelegate(AddressOf sampSyncObj.Square)
      callParameter = 17
      
      Dim aResult As IAsyncResult = sampleDelegate.BeginInvoke(callParameter, Nothing, Nothing)
      
      'Wait for the call to complete
      aResult.AsyncWaitHandle.WaitOne()
      
      callResult = sampleDelegate.EndInvoke(aResult)

      Console.WriteLine("Result of calling sampSyncObj.Square with {0} is {1}.", callParameter, callResult)

   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 Synchronization Context Attribute
//
[Synchronization()]
public class SampleSyncronized : ContextBoundObject
{
    // A method that does some work - returns the square of the given number
    public int Square(int i)
    {
        Console.Write("SampleSyncronized.Square called.  ");
        Console.WriteLine("The hash of the current thread is: {0}", Thread.CurrentThread.GetHashCode());
        return i*i;
    }
}


//
// Async delegate used to call a method with this signature asynchronously
//
public delegate int SampSyncSqrDelegate(int i);

//Main sample class
public class AsyncResultSample
{
    public static void Main()
    {
        int callParameter = 0;
        int callResult = 0;

        //Create an instance of a context-bound type SampleSynchronized
        //Because SampleSynchronized is context-bound, the object sampSyncObj 
        //is a transparent proxy
        SampleSyncronized sampSyncObj = new SampleSyncronized();


        //call the method synchronously
        Console.Write("Making a synchronous call on the object.  ");
        Console.WriteLine("The hash of the current thread is: {0}", Thread.CurrentThread.GetHashCode());
        callParameter = 10;
        callResult = sampSyncObj.Square(callParameter);
        Console.WriteLine("Result of calling sampSyncObj.Square with {0} is {1}.\n\n", callParameter, callResult);


        //call the method asynchronously
        Console.Write("Making an asynchronous call on the object.  ");
        Console.WriteLine("The hash of the current thread is: {0}", Thread.CurrentThread.GetHashCode());
        SampSyncSqrDelegate sampleDelegate = new SampSyncSqrDelegate(sampSyncObj.Square);
        callParameter = 17;

        IAsyncResult aResult = sampleDelegate.BeginInvoke(callParameter, null, null);

        //Wait for the call to complete
        aResult.AsyncWaitHandle.WaitOne();

        callResult = sampleDelegate.EndInvoke(aResult);
        Console.WriteLine("Result of calling sampSyncObj.Square with {0} is {1}.", callParameter, callResult);
    }
}
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 Synchronization Context Attribute
//
public ref class SampleSyncronized: public ContextBoundObject
{
public:

   // A method that does some work - returns the square of the given number
   int Square( int i )
   {
      Console::Write( "SampleSyncronized::Square called.  " );
      Console::WriteLine( "The hash of the current thread is: {0}", Thread::CurrentThread->GetHashCode() );
      return i * i;
   }

};

delegate int SampSyncSqrDelegate( //
// Async delegate used to call a method with this signature asynchronously
//
int i );

//Main sample class
int main()
{
   int callParameter = 0;
   int callResult = 0;
   
   //Create an instance of a context-bound type SampleSynchronized
   //Because SampleSynchronized is context-bound, the Object* sampSyncObj 
   //is a transparent proxy
   SampleSyncronized^ sampSyncObj = gcnew SampleSyncronized;
   
   //call the method synchronously
   Console::Write( "Making a synchronous call on the Object*.  " );
   Console::WriteLine( "The hash of the current thread is: {0}", Thread::CurrentThread->GetHashCode() );
   callParameter = 10;
   callResult = sampSyncObj->Square( callParameter );
   Console::WriteLine( "Result of calling sampSyncObj.Square with {0} is {1}.\n\n", callParameter, callResult );
   
   //call the method asynchronously
   Console::Write( "Making an asynchronous call on the Object*.  " );
   Console::WriteLine( "The hash of the current thread is: {0}", Thread::CurrentThread->GetHashCode() );
   SampSyncSqrDelegate^ sampleDelegate = gcnew SampSyncSqrDelegate( sampSyncObj, &SampleSyncronized::Square );
   callParameter = 17;
   IAsyncResult^ aResult = sampleDelegate->BeginInvoke( callParameter, nullptr, 0 );
   
   //Wait for the call to complete
   aResult->AsyncWaitHandle->WaitOne();
   callResult = sampleDelegate->EndInvoke( aResult );
   Console::WriteLine( "Result of calling sampSyncObj.Square with {0} is {1}.", callParameter, callResult );
}

플랫폼

Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile for Pocket PC, Windows Mobile for Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

.NET Framework에서 모든 플래폼의 모든 버전을 지원하지는 않습니다. 지원되는 버전의 목록은 시스템 요구 사항을 참조하십시오.

버전 정보

.NET Framework

2.0, 1.1, 1.0에서 지원

.NET Compact Framework

2.0, 1.0에서 지원

참고 항목

참조

IAsyncResult 멤버
System 네임스페이스