首页 > 解决方案 > 为什么等待操作员在调用标记为异步方法的方法时出错

问题描述

我知道有人问过类似的问题,但我对此一无所知。我收到消息:

CS4032 'await' 运算符只能在异步方法中使用。考虑使用“异步”修饰符标记此方法并将其返回类型更改为“任务”。

使用以下代码行:

var something = await _service.GetCurrentSomething(userAuthenticated);

这是方法,明确标记为异步(它正在调用 API):

public async Task<Something> GetCurrentSomething(bool isUserLoggedIn)
    {
        var response = _httpClientWrapper.ExecuteGet(
            _insert params here
        ).Result;

        var result = JsonConvert.DeserializeObject<Announcement>(response.ResponseBody);
        return result;
    }

现在编译器根本不会抱怨这个方法签名。那么为什么会出现错误消息?我从 MVC 控制器内部调用它,但我不想从方法中返回“某物”变量。那么为什么要宣传:

changing its return type to 'Task<ActionResult>'

顺便说一句,我已经完成了我的研究,没有什么完全符合要求。例如,该方法不是构造函数。

public async Task<ActionResult> Index()
    {

        var healthCheck = _heartbeatService.GetHeartBeat();

        if (healthCheck == null || healthCheck.Result == null || (!healtCheck.Result.Success))
        {
            return View("Error");
        }

        var user = System.Web.HttpContext.Current.User;

        bool userAuthenticated = (user != null) && user.Identity.IsAuthenticated;

        if (userAuthenticated)
        {
            var announcement = await _announcementService.GetCurrentAnnouncement(userAuthenticated);

            var model = CreateAnnouncementViewModel(announcement);

            if (user.IsInRole(Roles.WebAdmin) || user.IsInRole(Roles.Maintenance))
            {
                return RedirectToAction("Index", "AdminGuy");
            }
            if (user.IsInRole(Roles.Shop))
            {
                return RedirectToAction("Index", "Shopguy");
            }
        }

        var viewModel = new LoginViewModel();
        return View("HomePage", viewModel);
    }

标签: c#asp.net-web-api

解决方案


执行 await 的方法也需要有async关键字。

所以这不起作用:

public Task Hello()
{
    await _service.GetCurrentSomething(userAuthenticated);
}

但这会起作用:

public async Task Hello()
{
    await _service.GetCurrentSomething(userAuthenticated);
}

因此,如果您按照您所说的从控制器执行此调用,则需要将async关键字添加到您的操作方法并返回一个Task<IActionResult>. 您也可以将 void 用于异步内容,但实际上不建议这样做(仅用于事件处理程序等)。

关键字给你的唯一一件事async是它允许你使用await关键字。它不会使您的代码异步,除非您实际上以这种方式对其进行编码(通过使用异步 api,等待......而不是使用 .Result)。


推荐阅读