Подтвердить что ты не робот

Предупреждающее сообщение в асинхронном методе, в котором говорится, что ему не хватает операторов ожидания

У меня есть excel-загрузка в моем приложении asp.net mvc 4. Когда я нажимаю кнопку экспорта, вызывается метод контроллера. Поскольку мне нужно, чтобы это было сделано асинхронно, я использую async и жду здесь.

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);
    }

Этот метод inturn вызывает метод генератора excel ReportExcelAsync, как показано ниже.

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; 
    }

Но я получаю предупреждение как Предупреждение

В этом асинхронном методе отсутствуют операторы "ждут" и будут выполняться синхронно. Подумайте, используя оператор "ожидание", чтобы ждать неблокирующих вызовов API, или "ждут Task.Run(...)" для работы с привязкой к процессору в фоновом потоке

. Я делаю что-то неправильно?. Мой код отлично работает, и я могу получить excel, загруженный.

4b9b3361

Ответ 1

Я что-то делаю неправильно?

Хорошо, вы не делаете ничего асинхронно. Ваш метод ReportExcelAsync полностью синхронный, так как он не имеет выражений await. Таким образом, GenerateReportExcel вызовет ReportExcelAsync, который будет работать синхронно, а затем вернет завершенную задачу. Все, что вы сделали в данный момент, это добавить небольшое количество накладных расходов для создания конечного автомата и т.д., Которое используется для реализации async/await.

Непонятно, почему вы ожидали, что это произойдет асинхронно, но я подозреваю, что это неправильное понимание того, что ожидает/асинк на самом деле. Он не запускает новые потоки для вас автоматически - это просто упрощает создание и использование асинхронных API.

Теперь один из вариантов - просто изменить ReportExcelAsync на синхронный метод (ReportExcel, вернув string) и создать новую задачу для этого в вызывающем коде:

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

Однако, не ясно, что это на самом деле принесет вам большую пользу. Вы пишете веб-приложение, поэтому ему не нравится, что ответ будет доставлен быстрее всего - вы фактически просто переносите поток, над которым работа выполняется.

Вы говорите:

Так как мне нужно, чтобы это выполнялось асинхронно

... но не дает никаких оснований, почему это нужно делать асинхронно. Что не так с синхронным подходом в этом случае? Асинхронность велик, когда это уместно, но я не думаю, что это в вашем случае.