C# 异步方法中的警告消息,表示它缺少等待运算符
我的asp.NETMVC4应用程序中有一个excel下载。当我单击导出按钮时,将调用下面的控制器方法。因为我需要异步完成,所以我使用async并在这里等待C# 异步方法中的警告消息,表示它缺少等待运算符,c#,asp.net-mvc-4,async-await,C#,Asp.net Mvc 4,Async Await,我的asp.NETMVC4应用程序中有一个excel下载。当我单击导出按钮时,将调用下面的控制器方法。因为我需要异步完成,所以我使用async并在这里等待 public async Task<ActionResult> GenerateReportExcel() { ExcelGenerator excel = new ExcelGenerator(); var filePath = await excel.ReportExcelAsync(m
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()
{
ExcelGenerator excel=新的ExcelGenerator();
var filePath=await excel.ReportExcelAsync(midyearReportViewModel);
System.Web.HttpResponse response=System.Web.HttpContext.Current.response;
response.ClearContent();
response.Clear();
response.ContentType=“text/plain”;
AddHeader(“内容处置”,string.Format(“附件;文件名={0}.xlsx;”,PdaResource.ReportFileName));
响应.传输文件(文件路径);
response.Flush();
response.End();
返回PartialView(“midyarreportpartial”,midyarreportviewmodel);
}
此方法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;
}
公共异步任务报告ExcelAsync(MidYearReportViewModel\u midyearAnnualviewModel)
{
字符串fileName=“MidYearReport”;
string finalXcelPath=string.Empty;
字符串currentDirectorypath=new DirectoryInfo(HttpContext.Current.Server.MapPath(“~/Export”).ToString();
finalXcelPath=string.Format(“{0}\\{1}.xlsx”,currentDirectorypath,文件名);
if(System.IO.File.Exists(finalXcelPath))
{
System.IO.File.Delete(finalXcelPath);
}
var newFile=newfileinfo(finalXcelPath);
使用(ResXResourceSet resxSet=new ResXResourceSet(resxFile))
{
使用(var package=newexcelpackage(newFile))
{
Excel工作表=package.Workbook.Worksheets.Add(resxSet.GetString(“ReportMYMidYearExcelSheetName”);
对于(int i=1;i
我做错什么了吗
好吧,您并不是真正在异步执行任何操作。您的ReportExcelAsync
方法是完全同步的,因为它没有任何wait
表达式。因此GenerateReportExcel
将调用ReportExcelAsync
,该方法将同步运行,然后返回一个已完成的任务。此时您所做的一切t为创建用于实现async
/await
的状态机等增加了少量开销
不清楚您为什么期望它实际以异步方式发生,但我怀疑这是对wait/async实际作用的误解。它不会自动为您启动新线程—它只是使创建和使用异步API变得更容易
现在,一个选项是只想将reportexcelsync
更改为同步方法(ReportExcel
,返回字符串
),并在调用代码中为此创建一个新任务:
var filePath = await Task.Run(excel.ReportExcel);
然而,这是否真的能给你带来很多好处还不清楚。你正在编写一个web应用程序,因此,这种方式不会更快地提供响应——你实际上只是在转移工作的思路
你说:
因为我需要异步完成
…但请不要说明为什么需要异步执行。在这种情况下,同步方法有什么问题?异步在适当的时候是很好的,但我认为在您的情况下不是这样的。这一行var filePath=await excel.ReportExcelAsync(midyearReportViewModel);正在做什么?第二行。@stevethethread:如果ReportExcelAsync
确实是异步的,那就是异步做事情了,但事实并非如此。这是生成警告的方法,因为它没有Wait
表达式。@user2988112:我怀疑你对“异步”这个词的理解和我的不一样。你所做的每件事都是同步的-你期望异步从哪里来,你期望它有什么具体的好处?你实际上想解决什么问题?@user2988112:为什么?你仍然有同样多的工作要做,而且都是在本地完成的。你不会有任何空闲线程。这感觉就像你在想异步是一个神奇的子弹-事实并非如此。你必须考虑实际的异步将从何而来。例如,如果你可以从数据库异步获取数据,或者执行异步IO以减少所需的线程数-但我认为它不会帮帮你。你现在真的有性能问题吗?@Skeet没有。目前可能有30-40个用户,最多可能会增加到200-300个。谢谢你的澄清。