--- title: Async / Await localeTitle: Async / Await --- # Async / espera palabras clave Las palabras clave `async` / `await` en C # brindan formas convenientes de administrar aplicaciones que hacen un uso intensivo de recursos, que son más comunes en los lenguajes front-end, como las bibliotecas de Javascript. Los métodos que devuelven `Task` tipos de `Task` se pueden coronar con la palabra clave `async` , y al llamar a estos métodos en un controlador de UI o en un flujo de trabajo del servicio, podemos usar la `await` de los métodos para indicar a C # que devuelva el control a su interlocutor hasta el trabajo de fondo está terminado. Al ceder el control de las llamadas con uso intensivo de recursos, podemos permitir que la UI sea más receptiva y haga que el servicio sea más elástico. El núcleo de `async` y la `await` es la clase `Task` . Cuando se usa junto con la palabra clave `async` como el tipo de retorno de un método, indicamos que el método ha prometido devolver un objeto del tipo `T` (para los métodos que no devolverían ningún valor, use la `Task` como el tipo de retorno) . `Task` es un tema sofisticado propio, para obtener más información, consulte los documentos oficiales: [Clase de tarea](https://docs.microsoft.com/en-us/dotnet/api/system.threading.tasks.task?view=netframework-4.7.1) . Una vez que encuentre métodos `async` , el trabajo se pondrá en cola en un grupo de subprocesos para su ejecución, mientras que el llamante continuará su ejecución sin esperar los valores de retorno de los métodos `async` . Sin embargo, en la mayoría de las ocasiones, nuestra IU y nuestro servicio se basan en los valores devueltos por los métodos `async` : por ejemplo, cuando consultamos una base de datos local utilizando los métodos `async` , `async` saber cuáles son los resultados de la consulta y actuar sobre ellos. sincrónicamente. Aquí es donde la `await` se utilizará la palabra clave: si se utiliza el `await` palabra clave cuando se invoca un `async` método, la persona que llama hará una pausa en la ejecución hasta que el resultado se devuelve desde el `async` método, y la media de tiempo, el método de los padres va a continuar la ejecución sin tener que esperar en la persona que llama para terminar. Dicho esto, cualquier método que use la palabra clave `await` debe ser una función `async` sí mismo. Esto también lo aplica el compilador de C #. Si usa Visual Studio para escribir su código C #, el IDE le avisará si un método viola el `async-await` contrato. Para obtener más información sobre el uso del modelo de promesa para manejar la asincronía, consulte esta página de wikipedia: [Lograr la asincronía mediante promesas](https://en.wikipedia.org/wiki/Futures_and_promises) ## Ejemplos 1. Enviar formulario al servidor ```csharp private readonly string url = 'http://localhost:3000/api/submit'; private readonly HttpContent formContent = new HttypContent(); // Update the formContent object while filling up the form. SubmitButton.Clicked += async (object, event) => { // When PostAsync is hit, the button control will release the UI, while the // http post method is still waiting on server response. HttpClient httpClient = new HttpClient(); var response = await httpClient.PostAsync(url, formContent); Console.WriteLine(response.StatusCode); } ``` 2. Sincronizador de "pestillos" ```csharp public async Task CalcDamage(Player player) { // CPU-intense method, calculate afflicted damage done to the // Boss based on the damage types, Boss stats (from static data), // player stats, etc. // ... } public static async Task CalcTotalDamage(IEnumerable group) { var totalDamage = 0; foreach (Player player in group) { // each of the async methods are queued in the thread-pool and move on. totalDamage += CalcDamage(player); } // total damage done must be calculated from all players in the group // before we return the result. return await Task.WhenAll(totalDamage); } ``` ## Hoja de trucos * await: recupera el resultado de una llamada asíncrona en segundo plano. * aguarda Tarea. Cuando: Cualquiera: continúa si alguna de las tareas en cola está completa. * aguarda Tarea. Cuando todo: solo continúa si todas las tareas en cola están completas. * aguarda Task.Delay: manténgalo durante un período de tiempo adicional antes de la ejecución. ## Lectura en profundidad: * [Programación asíncrona](https://docs.microsoft.com/en-us/dotnet/csharp/async) * [Async en profundidad](https://docs.microsoft.com/en-us/dotnet/standard/async-in-depth) * [3 consejos esenciales para asnyc](https://channel9.msdn.com/Series/Three-Essential-Tips-for-Async)