Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异步方法中的警告消息,表示它缺少等待运算符_C#_Asp.net Mvc 4_Async Await - Fatal编程技术网

C# 异步方法中的警告消息,表示它缺少等待运算符

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

我的asp.NETMVC4应用程序中有一个excel下载。当我单击导出按钮时,将调用下面的控制器方法。因为我需要异步完成,所以我使用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);
    }
公共异步任务生成器端口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个。谢谢你的澄清。