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().
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正在等待释放上下文以便它可以完成.
| 归档时间: |
|
| 查看次数: |
170 次 |
| 最近记录: |