异步方法中的警告消息,指出它缺少等待运算符



我在 asp.net mvc 4应用程序中有一个excel下载。当我单击导出按钮时,将调用以下控制器方法。由于我需要异步完成它,所以我在这里使用异步和等待。

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

此方法反过来调用 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; 
}

但是我收到一条警告消息作为警告

此异步方法缺少"await"运算符,将同步运行。 考虑使用"await"运算符来等待非阻塞 API 调用, 或"await Task.Run(...)"在后台线程上执行 CPU 密集型工作

.我做错了什么吗?我的代码工作正常,我能够下载 excel。

我做错了什么吗?

好吧,你并没有真正异步地做任何事情。ReportExcelAsync方法是完全同步的,因为它没有任何await表达式。因此GenerateReportExcel将调用ReportExcelAsync,它将同步运行,然后返回已完成的任务。您目前所做的只是为创建用于实现async/await的状态机等添加少量开销。

目前尚不清楚为什么您希望它实际上是异步发生的,但我怀疑这是对等待/异步实际作用的误解。它不会自动启动新线程 - 它只是使创建和使用异步 API 变得更加容易。

现在一个选项是只想将ReportExcelAsync更改为同步方法(ReportExcel,返回string),并在调用代码中为其创建一个新任务:

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

但是,目前尚不清楚这是否真的会给您带来很多好处。您正在编写一个 Web 应用程序,因此响应不会以这种方式更快地交付 - 您实际上只是在转移完成工作的线程。

你说:

因为我需要异步完成

。但没有给出为什么需要异步完成的原因。在这种情况下,同步方法有什么问题?异步在适当的时候很棒,但我认为它不适合你。

最新更新