query.wait没有完成

ev *_* vk 2 c# entity-framework async-await

我是MVC C#中的异步方法的新手,所以我尝试了本教程中的一些示例

所以我用一种保存方法编写了一个类 creditcardtoken

public  async Task<CreditCardToken> RegisterCardTokenAsync(CreditCardToken creditCardToken)
{
    if (creditCardToken == null) return null;
    creditCardToken.number = creditCardToken.maskedNumber;
    _dbContext.CreditCardToken.Add(creditCardToken);
    var saveChanges = await (_dbContext.SaveChangesAsync());
    if (saveChanges > 0) return creditCardToken;
    else return null;
}
Run Code Online (Sandbox Code Playgroud)

我的控制器有一个调用我的方法 registerCardTokenAsync

[HttpPost]
public ActionResult IngresarTargeta(CreditCardViewModel creditCardViewModel)
{
    //do something here....
    //do another thing....

    var query = MyClass.RegisterCardTokenAsync(creditCardToken);
    query.Wait();
 }
Run Code Online (Sandbox Code Playgroud)

理论上,我们使用query.Wait()"等待"直到操作完成.我的问题是在我的数据库CreditCardToken中保存了,但是,我的应用程序只是冻结了.

为什么会发生这种情况,我该如何解决?

据我所知,执行时需要等待FirstOrDefaultAsync().

AAA*_*ddd 5

async除非你完全了解上下文,否则不要同步等待调用,让我们async传播.

public async Task<ActionResult> IngresarTargeta(CreditCardViewModel creditCardViewModel)
{
   var result = await MyClass.RegisterCardTokenAsync(creditCardToken)
Run Code Online (Sandbox Code Playgroud)

这就是原因

  • 顶级方法调用RegisterCardTokenAsync(在ASP.NET上下文中).

  • RegisterCardTokenAsync通过调用_dbContext.SaveChangesAsync()(仍在上下文中)启动保存更改 .

  • SaveChangesAsync返回未完成Task,表示保存未完成.

  • RegisterCardTokenAsync等待Task归来的SaveChangesAsync.捕获上下文并将用于SaveChangesAsync稍后继续运行该方法.SaveChangesAsync返回未完成Task,表示SaveChangesAsync方法未完成.

  • 顶级方法同步阻止Task返回的SaveChangesAsync.这会阻止上下文线程.

...

  • 最终,SaveChangesAsync意志将完成.这完成了Task由返回的SaveChangesAsync.

  • 为延续RegisterCardTokenAsync现在已经准备好运行,它等待的背景下可用于(因此它可以在上下文中执行).

这导致死锁.顶级方法阻止等待RegisterCardTokenAsync完成的上下文线程,并且RegisterCardTokenAsync正在等待释放上下文以便它可以完成.