72 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			72 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| ---
 | |
| 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<T>` tipos de `Task<T>` 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<T>` . 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<T>` 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<int> 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<int> CalcTotalDamage(IEnumerable<Player> 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) |