c# - 为什么等待操作员在调用标记为异步方法的方法时出错
问题描述
我知道有人问过类似的问题,但我对此一无所知。我收到消息:
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);
}
解决方案
执行 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)。
推荐阅读
- python - OpenStreetMap 未显示在 PyQt5 应用程序的 folium 地图上
- vb.net - 在 VB.Net 中嵌入视频
- xgboost - `object` 和 `newdata` 中存储的特征名称不同!使用 mlr 包
- discord - DiscordPy:如何获取 api 的实时更新
- postgresql - Postgresql 安装默认时区设置不同
- python - Visual Studio Code (VSC) python bash:意外标记“&”附近的语法错误
- c - 为什么在使用 isdigit 函数时出现分段错误?
- spring-boot - Spring Boot 2.5 Hibernate 错误:无法获取当前线程的事务同步会话
- python - 在文本字段中输入文本后如何按 Enter?
- python - 使用 python 将 csv 文件加载到 SnowFlake 表中