without run method create await async c# .net asynchronous async-await console-application

run - return task c#



¿Por qué se necesita AsyncContext cuando se usa async/await con una aplicación de consola? (1)

No es obligatorio; es solo mi preferencia.

Puede bloquear sincrónicamente una tarea dentro de Main (usando Wait / Result / WaitAll ). La semántica es ligeramente diferente; en particular, si el código asíncrono falla, entonces Wait / Result / WaitAll ajustará la excepción en una AggregateException , mientras que AsyncContext no lo hará.

Además, AsyncContext trata el hilo principal especialmente; en lugar de enviar continuaciones al grupo de subprocesos, los enviará de vuelta a ese subproceso principal (de manera predeterminada, siempre puede usar ConfigureAwait(false) para evitar esto). Me resulta útil si estoy escribiendo una aplicación de consola de "prueba de concepto", porque AsyncContext comporta de manera muy similar a los contextos de la interfaz de usuario.

Pero al final del día, es solo una cuestión de preferencia.

Estoy llamando a un método asíncrono dentro de mi aplicación de consola. No quiero que la aplicación se cierre poco después de que comience, es decir, antes de que se completen las tareas pendientes. Parece que puedo hacer esto:

internal static void Main(string[] args) { try { Task.WaitAll(DoThisAsync()); } catch (Exception ex) { Console.Error.WriteLine(ex); throw; } } internal static async Task DoThisAsync() { //... }

Pero de acuerdo con el artículo de Stephen Cleary, parece que no puedo hacer eso y, en su lugar, debería crear algún tipo de contexto para que la asincrónica regrese cuando esté listo (por ejemplo, AsyncContext ).

Sin embargo, el código anterior funciona y regresa en el hilo principal después de Task.WaitAll(DoThisAsync()); Entonces, ¿por qué necesito usar un contexto personalizado?