如何重新配置​​实体框架FirstOrDefaultAsync

sun*_*nil 2 c# entity-framework async-await asp.net-identity

使用ASP.NET身份并使用像这样的实体框架UserStore自定义到我自己的数据库表集时

public Task<MyUser> FindByNameAsync(string userName)
{
   var context = new CompanyDbContext();

   Task<MyUser> task = context.MyUsers.Where(u => u.UserName == userName)
                                      .FirstOrDefaultAsync();

   return task;
}
Run Code Online (Sandbox Code Playgroud)

并调用它像这样工作正常:

MyUser user = await userManager.FindAsync(context.UserName, context.Password);
Run Code Online (Sandbox Code Playgroud)

现在,我想用硬编码的用户列表替换它,如下所示:

public Task<MyUser> FindByNameAsync(string userName)
{
   var myusers = new List<MyUser> 
   { 
       new MyUser() { Id="1", UserName = "tom", Password = "secret" },
       new MyUser() { Id="2", UserName = "mary", Password = "supersecret" }
   };

   Task<MyUser> task = new Task<MyUser>(() => myusers.SingleOrDefault(
                                                  u => u.UserName == userName));

   return task;
}
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为它挂在这条线上

MyUser user = await userManager.FindAsync(context.UserName, context.Password);
Run Code Online (Sandbox Code Playgroud)

任何建议,将不胜感激.

Ser*_*rvy 6

你创建了它Task,但从未启动它,因此它永远不会运行,所以等待它意味着永远等待.

您可以Start在创建任务后添加一个调用,但是创建要立即运行的任务时的首选选项是简单地使用Task.Run(或者Task.Factory.StartNew如果您使用的是.NET 4.0).

最重要的,您的代码甚至不需要在后台线程中运行.它将足够快地完成,您可以简单地同步执行它.您可以使用它Task.FromResult来计算结果并将其包装在已完成的任务中.

  • 没有; 如果这是一个长期运行的生产操作,我说它应该在同步方法中同步阻塞(因为你不想在ASP.NET上卸载).如果你正在测试/模拟,那么我认为它不会长时间运行,并且`Task.FromResult`将是最好的.我无法想象你有一个长期运行的测试存根的现实场景. (2认同)