为什么我不能等待?

时间:2014-08-13 16:05:55

标签: c# asynchronous async-await

我正在使用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);

报告以下错误:

  

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

该方法是一种异步方法,为什么我不能使用"等待"?

另外,将致电:

DatabaseContext.Users.Load();

在FirstAsync优化之前(而不是构建我假设FirstSync所做的ToList)?

我仍然试图掌握异步内容可以做的事情,因此非常感谢任何有用的链接。

2 个答案:

答案 0 :(得分:5)

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

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

 return thisUserAccount;
}

这就是错误消息告诉你的。

答案 1 :(得分:2)

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

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

以下链接使用asyncawait提供了异步编程的概述:
http://msdn.microsoft.com/en-us/library/hh191443.aspx