【问题标题】:async task lacks await for MVC IHttpActionResult controller异步任务缺少等待 MVC IHttpActionResult 控制器
【发布时间】:2016-05-25 11:04:41
【问题描述】:

我正在使用异步任务返回我使用数据字典建模的 Json 数据。我希望任务异步执行,同时它从我的方法 report.GetActiveBuildDefinitions() 和我的 CurrentState 对象调用我的数据库,该对象有一个获取我需要的数据的构造函数。这就是我说的构造函数 -> new CurrentState(BuildDef.ID); 该控制器功能正常。但是当我将警告启用为错误时。我的课没有建立。它要求我对异步任务使用 await 关键字。我尝试将它添加到返回,如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-await 模式的信息,或者在 SO 上找到一些已经回答此类问题的帖子。
  • 如果您没有使用任何等待操作,请将其更改为“public IHttpActionResult GetBuildState()”。
  • 当我删除异步...... Json() 方法失败并且不起作用。它给出了转换错误。 @AjinderSingh
  • @ThabaneNdaba - 错误是什么?
  • @ThabaneNdaba - 可以尝试返回 Json(state,JsonRequestBehavior.AllowGet);

标签: c# asynchronous model-view-controller


【解决方案1】:

我希望任务异步执行

但是为什么呢?你认为异步会给你带来什么好处,在这里?

提示:async 不是的意思是“早点回来”。

当前在你的控制器动作中的一切都是同步的,所以你的控制器动作也应该是同步的:

public IHttpActionResult GetBuildState()

现在,如果您将 I/O 调用更改为自然异步(即,使用 EF6 异步查询),那么您的控制器操作最终可能会调用异步方法:

var definitions = await report.GetActiveBuildDefinitionsAsync();

此时,编译器会告诉您使 GetBuildState 异步并将其返回类型更改为 Task&lt;IHttpActionResult&gt;

【讨论】:

    猜你喜欢
    • 2015-05-19
    • 1970-01-01
    • 2012-10-14
    • 1970-01-01
    • 2012-12-07
    • 2023-03-08
    • 1970-01-01
    • 2014-03-18
    相关资源
    最近更新 更多