簡體   English   中英

異步任務缺少對MVC IHttpActionResult控制器的等待

[英]async task lacks await for MVC IHttpActionResult controller

我正在使用一個異步任務來返回我使用數據字典建模的Json數據。 我希望任務在它從我的方法report.GetActiveBuildDefinitions()和我的CurrentState對象(它有一個構造函數可以獲取我需要的數據report.GetActiveBuildDefinitions()數據庫調用時異步執行。 這是我正在談論的構造函數-> new CurrentState(BuildDef.ID); 該控制器正常運行。 但是當我啟用警告作為錯誤。 我的課程無法建立。 它要求我將await關鍵字用於異步任務。 我嘗試將其添加到return中,例如return await Json(state); 但隨后出現錯誤“不包含getawaiter的定義”,請幫助

這是我的控制器:

        [HttpGet]
    public async Task<IHttpActionResult> GetBuildState()
    {
        try
        {
            List<CurrentState> state = new List<CurrentState>();
            BuildReport report = new BuildReport();
            List<BuildDefinition> definitions = report.GetActiveBuildDefinitions();
            List<Dictionary<string, string>> buildInfo = new List<Dictionary<string, string>>();

            foreach (BuildDefinition BuildDef in definitions)
            {
                state.Add(new CurrentState(BuildDef.ID));
            }

            foreach (CurrentState build in state)
            {
                Dictionary <string, string> entry = new Dictionary<string, string>();
                if (build.ITestExists)
                {
                    if (build.ITestState && build.BuildState)
                    {
                        entry.Add("BuildDef", build.BuildDefName);
                        entry.Add("GraphCode", "1");
                        entry.Add("WorkingBrokenTime", GetTime(build.BuildDefID));
                        entry.Add("Icon", "1");
                        entry.Add("Id", build.BuildDefID.ToString());
                    }
                    else if(build.BuildState && build.ITestState.Equals(false))
                    {
                        entry.Add("BuildDef", build.BuildDefName);
                        entry.Add("GraphCode", "2");
                        entry.Add("WorkingBrokenTime", GetTime(build.BuildDefID));
                        entry.Add("Icon", "0");
                        entry.Add("Id", build.BuildDefID.ToString());
                    }
                    else if (build.BuildState.Equals(false) && build.ITestState)
                    {
                        entry.Add("BuildDef", build.BuildDefName);
                        entry.Add("GraphCode", "3");
                        entry.Add("WorkingBrokenTime", GetTime(build.BuildDefID));
                        entry.Add("Icon", "0");
                        entry.Add("Id", build.BuildDefID.ToString());
                    }
                    else if (build.ITestState.Equals(false) && build.BuildState.Equals(false))
                    {
                        entry.Add("BuildDef", build.BuildDefName);
                        entry.Add("GraphCode", "0");
                        entry.Add("WorkingBrokenTime", GetTime(build.BuildDefID));
                        entry.Add("Icon", "0");
                        entry.Add("Id", build.BuildDefID.ToString());
                    }

                }
                else
                {
                    if (build.BuildState)
                    {
                        entry.Add("BuildDef", build.BuildDefName);
                        entry.Add("GraphCode", "4");
                        entry.Add("WorkingBrokenTime", GetTime(build.BuildDefID));
                        entry.Add("Icon", "1");
                        entry.Add("Id", build.BuildDefID.ToString());
                    }
                    else
                    {
                        entry.Add("BuildDef", build.BuildDefName);
                        entry.Add("GraphCode", "5");
                        entry.Add("WorkingBrokenTime", GetTime(build.BuildDefID));
                        entry.Add("Icon", "0");
                        entry.Add("Id", build.BuildDefID.ToString());
                    }
                }
                buildInfo.Add(entry);
            }
            return Json(state);
        }
        catch (Exception)
        {
            return BadRequest(ModelState);
        }
    }

我希望任務異步執行

但為什么? 您認為異步會給您帶來什么好處?

提示: async 並不意味着“提前返回”。

當前控制器動作中的所有內容都是同步的,因此您的控制器動作也應該是同步的:

public IHttpActionResult GetBuildState()

現在,如果將您的I / O調用更改為自然異步(即使用EF6異步查詢),那么您的控制器操作可能最終會調用異步方法:

var definitions = await report.GetActiveBuildDefinitionsAsync();

然后,編譯器將告訴您使GetBuildState異步並將其返回類型更改為Task<IHttpActionResult>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM