async (Referencia de C#)

El modificador de async indica que el método, expresión lambda, o método anónimo que modifica es asincrónicos.Tales métodos se conocen como métodos async.

Un método async proporciona una manera cómoda de hacer el trabajo de larga duración sin bloquear el subproceso del llamador.El llamador de un método async puede reanudar el trabajo sin esperar a que el método async finalice.

[!NOTA]

Las palabras clave de async y de await se introdujeron en Visual Studio 2012.Para obtener información sobre otras nuevas características en esa versión, vea Novedades de Visual Studio 2012.

Para obtener una introducción a la programación async, vea Programación asincrónica con Async y Await (C# y Visual Basic).

El ejemplo siguiente se muestra la estructura de un controlador de eventos async, StartButton_Click, que llama a un método async, ExampleMethodAsync.El resultado del método es la longitud de un sitio Web descargado.El código es adecuado para un Windows Presentation Foundation (WPF) o Windows almacena aplicación.

// In desktop apps that you create by using Visual Studio 2012, you must 
// add a reference and a using directive for System.Net.Http.
// In Windows Store apps, you must add using directives for System.Net.Http 
// and System.Threading.Tasks.

private async void StartButton_Click(object sender, RoutedEventArgs e)
{
    // ExampleMethodAsync returns a Task<int> and has an int result.
    // A value is assigned to intTask when ExampleMethodAsync reaches
    // an await.
    try
    {
        Task<int> intTask = ExampleMethodAsync();
        // You can do other work here that doesn't require the result from
        // ExampleMethodAsync. . . .
        // You can access the int result when ExampleMethodAsync completes.
        int intResult = await intTask;
    
        // Or you can combine the previous two steps:
        //int intResult = await ExampleMethodAsync();

        // Process the result (intResult). . . .
    }
    catch (Exception)
    {
        // Process the exception. . . .
    }
}

public async Task<int> ExampleMethodAsync()
{
    var httpClient = new HttpClient();

    // At the await expression, execution in this method is suspended, and
    // control returns to the caller of ExampleMethodAsync.
    // Variable exampleInt is assigned a value when GetStringAsync completes.
    int exampleInt = (await httpClient.GetStringAsync("https://msdn.microsoft.com")).Length;

    // You can break the previous line into several steps to clarify what happens:
    //Task<string> contentsTask = httpClient.GetStringAsync("https://msdn.microsoft.com");
    //string contents = await contentsTask;
    //int exampleInt = contents.Length; 

    // Continue with whatever processing is waiting for exampleInt. . . .

    // After the return statement, any method that's awaiting
    // ExampleMethodAsync can get the integer result.
    return exampleInt;
}
Nota importanteImportante

Para obtener un ejemplo completo de WPF que utilice elementos similares, vea Walkthrough: Acceso a web usando Async y Await (C# y Visual Basic).Puede descargar el código del Ejemplos de código del desarrollador tutorial de.

Normalmente, un método modificado por la palabra clave de async contiene al menos una expresión o instrucción de espera.El método se ejecuta sincrónicamente hasta alcanzar la primera expresión de await, en la que se suspende el punto él hasta completar la tarea aguardada.Mientras tanto, el control se devuelve al llamador del método.Si el método no contiene una expresión de await o instrucción, se ejecuta de forma sincrónica.Una advertencia del compilador alerta a cualquier método async que no contiene await porque esa situación podría indicar un error.Para obtener más información, vea Advertencia del compilador (nivel 1) CS4014.

La palabra clave de async es una palabra clave contextual.Es una palabra clave cuando modifica un método, una expresión lambda, o un método anónimo.En todos los demás contextos, se interpreta como un identificador.

Tipos de valor devueltos

Un método async puede tener un tipo de valor devuelto de Task, de Task<TResult>, o de vacío.El método no puede declarar los parámetros de referencia o de out, aunque puede llamar a los métodos que tienen estos parámetros.

Especifica Task<TResult> como tipo de valor devuelto de un método async si la instrucción de return de método especifica un operando de tipo TResult.Utiliza Task si no se devuelve ningún valor significativo cuando se completa el método.Es decir, una llamada al método devuelve Task, pero cuando se completa Task, las expresiones de await que está esperando Task se evalúa como void.

Se usa el tipo de devolución de void principalmente para definir controladores de eventos, donde se requiere un tipo de valor devuelto de void.El llamador de un método async vacío- que devuelve no puede aguardarlo y no puede detectar las excepciones que el método produce.

Para obtener más información y ejemplos, vea Tipos de valor devuelto de Async (C y Visual Basic).

Vea también

Tareas

Walkthrough: Acceso a web usando Async y Await (C# y Visual Basic)

Referencia

await (Referencia de C#)

AsyncStateMachineAttribute

Conceptos

Programación asincrónica con Async y Await (C# y Visual Basic)