AsyncStateMachineAttribute Classe

Definizione

Indica se un metodo è contrassegnato con il modificatore Async o async.Indicates whether a method is marked with either the Async or async modifier.

public ref class AsyncStateMachineAttribute sealed : System::Runtime::CompilerServices::StateMachineAttribute
[System.AttributeUsage(System.AttributeTargets.Method, AllowMultiple=false, Inherited=false)]
[System.Serializable]
public sealed class AsyncStateMachineAttribute : System.Runtime.CompilerServices.StateMachineAttribute
type AsyncStateMachineAttribute = class
    inherit StateMachineAttribute
Public NotInheritable Class AsyncStateMachineAttribute
Inherits StateMachineAttribute
Ereditarietà
AsyncStateMachineAttribute
Attributi

Esempi

Come illustrato nell'esempio seguente, è possibile determinare se un metodo è contrassegnato con il modificatore async o Async. As the following example shows, you can determine whether a method is marked with Async or async modifier. Nell'esempio, IsAsyncMethod esegue i passaggi seguenti:In the example, IsAsyncMethod performs the following steps:

  • Ottiene un MethodInfo oggetto per il nome del metodo Type.GetMethodtramite.Obtains a MethodInfo object for the method name by using Type.GetMethod.

  • Ottiene un Type oggetto per l'attributo utilizzando l' operatore GetType o typeof.Obtains a Type object for the attribute by using GetType Operator or typeof.

  • Ottiene un oggetto attributo per il metodo e il tipo di MethodInfo.GetCustomAttributeattributo tramite.Obtains an attribute object for the method and attribute type by using MethodInfo.GetCustomAttribute. Se GetCustomAttribute null restituisce Nothing (Visual Basic) o (C#), il metodo non contiene l'attributo.If GetCustomAttribute returns Nothing (Visual Basic) or null (C#), the method doesn't contain the attribute.

using System;
using System.Collections.Generic;
using System.Reflection;
using System.Threading.Tasks;
using System.Runtime.CompilerServices;

namespace ConsoleApplication1
{

    // This class is used by the code below to discover method attributes.
    public class TheClass
    {
        public async Task<int> AsyncMethod()
        {
            await Task.Delay(5);
            return 1;
        }

        public int RegularMethod()
        {
            return 0;
        }
    }

    class Program
    {
        private static bool IsAsyncMethod(Type classType, string methodName)
        {
            // Obtain the method with the specified name.
            MethodInfo method = classType.GetMethod(methodName);

            Type attType = typeof(AsyncStateMachineAttribute);

            // Obtain the custom attribute for the method.
            // The value returned contains the StateMachineType property.
            // Null is returned if the attribute isn't present for the method.
            var attrib = (AsyncStateMachineAttribute)method.GetCustomAttribute(attType);

            return (attrib != null);
        }

        private static void ShowResult(Type classType, string methodName)
        {
            Console.Write((methodName + ": ").PadRight(16));

            if (IsAsyncMethod(classType, methodName))
                Console.WriteLine("Async method");
            else
                Console.WriteLine("Regular method");
        }

        static void Main(string[] args)
        {
            ShowResult(classType: typeof(TheClass), methodName: "AsyncMethod");
            ShowResult(classType: typeof(TheClass), methodName: "RegularMethod");

            // Note: The IteratorStateMachineAttribute applies to Visual Basic methods
            // but not C# methods.

            Console.ReadKey();
        }

        // Output:
        //   AsyncMethod:    Async method
        //   RegularMethod:  Regular method
    }
}

Imports System.Collections.Generic
Imports System.Reflection
Imports System.Threading.Tasks
Imports System.Runtime.CompilerServices


Module Module1

    ' This class is used by the code below to discover method attributes.
    Public Class TheClass
        Public Async Function AsyncMethod() As Task(Of Integer)
            Await Task.Delay(5)
            Return 1
        End Function

        Public Iterator Function IteratorMethod() As IEnumerable(Of Integer)
            Yield 1
            Yield 2
        End Function

        Public Function RegularMethod() As Integer
            Return 0
        End Function
    End Class


    Private Function IsAsyncMethod(classType As Type, methodName As String)
        ' Obtain the method with the specified name.
        Dim method As MethodInfo = classType.GetMethod(methodName)

        Dim attType As Type = GetType(AsyncStateMachineAttribute)

        Dim attrib = CType(method.GetCustomAttribute(attType), AsyncStateMachineAttribute)
        ' The above variable contains the StateMachineType property.

        Return (attrib IsNot Nothing)
    End Function

    Private Function IsIteratorMethod(classType As Type, methodName As String)
        ' Obtain the method with the specified name.
        Dim method As MethodInfo = classType.GetMethod(methodName)

        Dim attType As Type = GetType(IteratorStateMachineAttribute)

        ' Obtain the custom attribute for the method.
        ' The value returned contains the StateMachineType property.
        ' Nothing is returned if the attribute isn't present for the method.
        Dim attrib = CType(method.GetCustomAttribute(attType), IteratorStateMachineAttribute)

        Return (attrib IsNot Nothing)
    End Function

    Private Sub ShowResult(classType As Type, methodName As String)
        Console.Write((methodName & ": ").PadRight(16))

        If IsAsyncMethod(classType, methodName) Then
            Console.WriteLine("Async method")
        ElseIf IsIteratorMethod(classType, methodName) Then
            Console.WriteLine("Iterator method")
        Else
            Console.WriteLine("Regular method")
        End If

        ' Note: The IteratorStateMachineAttribute applies to Visual Basic methods
        ' but not C# methods.
    End Sub

    Sub Main()
        ShowResult(GetType(TheClass), "AsyncMethod")
        ShowResult(GetType(TheClass), "IteratorMethod")
        ShowResult(GetType(TheClass), "RegularMethod")

        Console.ReadKey()
    End Sub

    '   AsyncMethod:    Async method
    '   IteratorMethod: Iterator method
    '   RegularMethod:  Regular method

End Module

Commenti

Non è necessario applicare AsyncStateMachine l'attributo ai metodi nel codice.You shouldn't apply the AsyncStateMachine attribute to methods in your code. Per i metodi con il modificatore async, il compilatore applicherà l' AsyncStateMachine attributo nel linguaggio il generato dal compilatore.For methods that have the async modifier, the compiler will apply the AsyncStateMachine attribute in the IL that the compiler emits.

Quando un metodo (MethodName) ha il modificatore async o async, il compilatore genera il che include una struttura della macchina a Stati.When a method (MethodName) has the Async or async modifier, the compiler emits IL that includes a state machine structure. Questa struttura contiene il codice nel metodo.This structure contains the code in the method. Tale IL contiene anche un metodo stub (MethodName) che chiama nella macchina a Stati.That IL also contains a stub method (MethodName) that calls into the state machine. Il compilatore aggiunge l' AsyncStateMachine attributo al metodo stub in modo che gli strumenti possano identificare la macchina a stati corrispondente.The compiler adds the AsyncStateMachine attribute to the stub method so that tools can identify the corresponding state machine. I dettagli del linguaggio intermedio emesso potrebbero cambiare nelle versioni future dei compilatori.Details of the emitted IL might change in future releases of the compilers.

Per informazioni sulla funzionalità async, vedere programmazione asincrona con Async e await.For information about the Async feature, see Asynchronous Programming with Async and Await.

Costruttori

AsyncStateMachineAttribute(Type)

Inizializza una nuova istanza della classe AsyncStateMachineAttribute.Initializes a new instance of the AsyncStateMachineAttribute class.

Proprietà

StateMachineType

Restituisce l'oggetto tipo per il tipo sottostante della macchina a stati generato dal compilatore per implementare il metodo della macchina a stati.Returns the type object for the underlying state machine type that was generated by the compiler to implement the state machine method.

(Ereditato da StateMachineAttribute)
TypeId

Quando è implementata in una classe derivata, ottiene un identificatore univoco della classe Attribute.When implemented in a derived class, gets a unique identifier for this Attribute.

(Ereditato da Attribute)

Metodi

Equals(Object)

Restituisce un valore che indica se questa istanza è uguale a un oggetto specificato.Returns a value that indicates whether this instance is equal to a specified object.

(Ereditato da Attribute)
GetHashCode()

Restituisce il codice hash per l'istanza.Returns the hash code for this instance.

(Ereditato da Attribute)
GetType()

Ottiene l'oggetto Type dell'istanza corrente.Gets the Type of the current instance.

(Ereditato da Object)
IsDefaultAttribute()

In caso di override in una classe derivata, indica se il valore di questa istanza è il valore predefinito per la classe derivata.When overridden in a derived class, indicates whether the value of this instance is the default value for the derived class.

(Ereditato da Attribute)
Match(Object)

Quando è sottoposto a override in una classe derivata, restituisce un valore che indica se questa istanza equivale a un oggetto specificato.When overridden in a derived class, returns a value that indicates whether this instance equals a specified object.

(Ereditato da Attribute)
MemberwiseClone()

Crea una copia superficiale dell'oggetto Object corrente.Creates a shallow copy of the current Object.

(Ereditato da Object)
ToString()

Restituisce una stringa che rappresenta l'oggetto corrente.Returns a string that represents the current object.

(Ereditato da Object)

Implementazioni dell'interfaccia esplicita

_Attribute.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr)

Esegue il mapping di un set di nomi a un set corrispondente di ID dispatch.Maps a set of names to a corresponding set of dispatch identifiers.

(Ereditato da Attribute)
_Attribute.GetTypeInfo(UInt32, UInt32, IntPtr)

Recupera le informazioni sul tipo relative a un oggetto, che possono essere usate per ottenere informazioni sul tipo relative a un'interfaccia.Retrieves the type information for an object, which can be used to get the type information for an interface.

(Ereditato da Attribute)
_Attribute.GetTypeInfoCount(UInt32)

Recupera il numero delle interfacce di informazioni sul tipo fornite da un oggetto (0 o 1).Retrieves the number of type information interfaces that an object provides (either 0 or 1).

(Ereditato da Attribute)
_Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr)

Fornisce l'accesso a proprietà e metodi esposti da un oggetto.Provides access to properties and methods exposed by an object.

(Ereditato da Attribute)

Si applica a

Vedi anche