without not method false directly configureawait calling await async c# asynchronous async-await

not - method void async c#



El uso de ConfigureAwait(false) en las tareas pasadas a Task.WhenAll() falla (1)

Solo necesita ConfigureAwait cuando realmente realice la await , la forma correcta sería

[HttpGet] public async Task<JsonResult> doAsyncStuff() { var t1 = this.service1.task1(); var t2 = this.service2.task2(); var t3 = this.service3.task3(); var t4 = this.service4.task4(); await Task.WhenAll(t1,t2,t3,t4).ConfigureAwait(false); return this.Json(new {redirect = true, href = Url.Action("Blah")}, JsonRequestBehavior.AllowGet); }

Estoy tratando de decidir cómo esperar en todas las tareas asíncronas para completar.

Aquí está el código que tengo actualmente

[HttpGet] public async Task<JsonResult> doAsyncStuff() { var t1 = this.service1.task1(); var t2 = this.service2.task2(); var t3 = this.service3.task3(); var t4 = this.service4.task4(); await Task.WhenAll(t1,t2,t3,t4); return this.Json(new {redirect = true, href = Url.Action("Blah")}, JsonRequestBehavior.AllowGet); }

Estoy bastante seguro de que el contexto de sincronización no es relevante, así que intenté esto.

[HttpGet] public async Task<JsonResult> doAsyncStuff() { var t1 = this.service1.task1().ConfigureAwait(false); var t2 = this.service2.task2().ConfigureAwait(false); var t3 = this.service3.task3().ConfigureAwait(false); var t4 = this.service4.task4().ConfigureAwait(false); await Task.WhenAll(t1,t2,t3,t4); return this.Json(new {redirect = true, href = Url.Action("Blah")}, JsonRequestBehavior.AllowGet); }

El problema ahora es Task.WhenAll tiene argumentos no válidos porque no aceptará Awaiatables de Tarea Configurada.

Así que Task.WhenAll necesita ser reemplazado con esto

await t1; await t2; await t3; await t4;

Esto no me parece correcto, sin embargo, virtualmente en todos los lugares donde alguien tiene algo que decir sobre ConfigureAwait es "usarlo, si no se produce un error". Y que yo sepa (no escribí las tareas), no usan el Contexto Sincrónico, ni se basan en él.

Es importante tener en cuenta que me gustaría que task1 a task4 se ejecuten al mismo tiempo, ya que no se basan en el acabado anterior. Como resultado no quiero esperar delante de cada tarea. Pero no quiero devolver la respuesta de Json hasta que se hayan completado las 4, razón por la cual actualmente tengo a la espera la Tarea.Cuando (Todo) () en el código actual.