understanding net mvc method example await async asp c# asp.net-mvc-4 async-await

c# - net - Mensaje de advertencia en método asíncrono que dice que carece de operadores a la espera



understanding async await c# (1)

Tengo una descarga excel en mi aplicación asp.net mvc 4. Cuando hago clic en el botón exportar, se llama al método de controlador a continuación. Como necesito que se haga asincrónicamente, estoy usando asincrónico y espero aquí.

public async Task<ActionResult> GenerateReportExcel() { ExcelGenerator excel = new ExcelGenerator(); var filePath = await excel.ReportExcelAsync(midyearReportViewModel); System.Web.HttpResponse response = System.Web.HttpContext.Current.Response; response.ClearContent(); response.Clear(); response.ContentType = "text/plain"; response.AddHeader("Content-Disposition", string.Format("attachment;filename={0}.xlsx;", PdaResource.ReportFileName)); response.TransmitFile(filePath); response.Flush(); response.End(); return PartialView("_MidYearReportPartial", midyearReportViewModel); }

Este método llama a un método generador de Excel ReportExcelAsync como se muestra a continuación

public async Task<string> ReportExcelAsync(MidYearReportViewModel _midyearAnnualviewModel) { string fileName = "MidYearReport"; string finalXcelPath = string.Empty; string currentDirectorypath = new DirectoryInfo(HttpContext.Current.Server.MapPath("~/Export")).ToString(); finalXcelPath = string.Format("{0}//{1}.xlsx", currentDirectorypath, fileName); if (System.IO.File.Exists(finalXcelPath)) { System.IO.File.Delete(finalXcelPath); } var newFile = new FileInfo(finalXcelPath); using (ResXResourceSet resxSet = new ResXResourceSet(resxFile)) { using (var package = new ExcelPackage(newFile)) { ExcelWorksheet worksheet = package.Workbook.Worksheets.Add(resxSet.GetString("ReportMYMidYearExcelSheetName")); for (int i = 1; i <= header.Count(); i++) { worksheet.Cells[1, i].Value = header[i - 1]; worksheet.Cells[1, i].Style.Font.Bold = true; worksheet.Cells[1, i].Style.Fill.PatternType = ExcelFillStyle.Solid; worksheet.Cells[1, i].Style.Font.Color.SetColor(Color.White); worksheet.Cells[1, i].Style.Fill.BackgroundColor.SetColor(Color.DimGray); } package.Save(); } } return finalXcelPath; }

Pero recibo un mensaje de advertencia como Advertencia

Este método asíncrono carece de operadores ''en espera'' y se ejecutará de forma síncrona. Considere usar el operador ''await'' para esperar llamadas API sin bloqueo, o ''aguarde Task.Run (...)'' para hacer un trabajo en CPU en un hilo de fondo

. ¿Estoy haciendo algo mal?. Mi código funciona bien y puedo descargar el Excel.


¿Estoy haciendo algo mal?

Bueno, en realidad no estás haciendo nada asincrónicamente. Su método ReportExcelAsync es completamente sincrónico, ya que no tiene ninguna expresión en await . Así que GenerateReportExcel llamará a ReportExcelAsync , que se ejecutará de forma síncrona, y luego devolverá una tarea completada. Todo lo que ha hecho en este momento es agregar una pequeña cantidad de sobrecarga para crear la máquina de estado, etc., que se usa para implementar async / await .

No está claro por qué esperabas que sucediera de manera asíncrona, pero sospecho que es un malentendido de lo que realmente espera / async. No inicia automáticamente nuevos subprocesos, simplemente hace que sea mucho más fácil crear y consumir API asíncronas.

Ahora, una opción es simplemente querer cambiar ReportExcelAsync en un método síncrono ( ReportExcel , devolver una string ) y crear una nueva tarea para eso en el código de llamada:

var filePath = await Task.Run(excel.ReportExcel);

Sin embargo, no está claro que esto en realidad le daría mucho beneficio. Estás escribiendo una aplicación web, por lo que no es como si la respuesta se entregara más rápido de esta manera: simplemente estás cambiando el hilo del trabajo.

Tu dices:

Como necesito que se haga asincrónicamente

... pero no da ninguna razón por la que deba hacerse de forma asíncrona. ¿Qué pasa con el enfoque sincrónico en este caso? La asincronía es excelente cuando es apropiado, pero no creo que sea en tu caso.