【问题标题】:Why cant I use await?为什么我不能使用等待?
【发布时间】:2014-10-07 02:22:18
【问题描述】:

我正在使用 MVC5 中的 Identity 2.0,并且正在尝试为当前用户获取第一个角色。

这段代码没有报错:

var DatabaseContext = new ApplicationDbContext();
var thisUserAccount = DatabaseContext.Users.FirstAsync(u => u.Id == Id);

这段代码:

var DatabaseContext = new ApplicationDbContext();
var thisUserAccount = await DatabaseContext.Users.FirstAsync(u => u.Id == Id);

报告如下错误:

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

该方法是异步方法,为什么我不能使用“等待”?

另外,将调用:

DatabaseContext.Users.Load();

在 FirstAsync 之前稍微优化一下(而不是像我假设 FirstSync 那样构建一个 ToList)?

我仍在尝试了解异步内容可以做什么,因此非常感谢任何有用的链接。

【问题讨论】:

  • 该方法是异步方法 - 你确定吗?您调用的方法必须是异步的。显示整个方法(或至少是签名)。

标签: c# asynchronous async-await


【解决方案1】:

以下特征总结了使方法异步的原因(您缺少第一个)。

  • 方法签名包含一个异步修饰符。
  • 注意:按照惯例,异步方法的名称以“Async”后缀结尾。
  • 返回类型是以下类型之一:
    • Task<TResult> 如果您的方法有一个 return 语句,其中 操作数的类型为 TResult。
    • 如果您的方法没有 return 语句或有一个没有操作数的 return 语句,则执行任务。
    • 如果您正在编写异步事件处理程序,则无效。

以下链接很好地概述了使用 asyncawait 进行异步编程:
http://msdn.microsoft.com/en-us/library/hh191443.aspx

【讨论】:

    【解决方案2】:

    您需要将使用await 的方法标记为异步:

    async Task<UserAccount> DoStuff()
    {
     var DatabaseContext = new ApplicationDbContext();
     var thisUserAccount = await DatabaseContext.Users.FirstAsync(u => u.Id == Id);
    
     return thisUserAccount;
    }
    

    这就是错误消息告诉您的内容。

    【讨论】:

    • 我可能是错的,但不应该(不总是)一个 ansyc 方法返回任务以便等待它?
    • @ErikPhilips 我们不知道这是否是顶级方法,所以真的没有办法知道它应该返回什么。
    • @Servy 我绝对同意。我发现通常情况下,最好在这些情况下至少返回Task 作为示例并谈论它们,然后假设无效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-12
    • 1970-01-01
    相关资源
    最近更新 更多