c# - query.wait 没有完成
问题描述
我是 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;
}
我的控制器有一个调用我的方法registerCardTokenAsync
[HttpPost]
public ActionResult IngresarTargeta(CreditCardViewModel creditCardViewModel)
{
//do something here....
//do another thing....
var query = MyClass.RegisterCardTokenAsync(creditCardToken);
query.Wait();
}
理论上,我们使用query.Wait()
“等待”直到操作完成。我的问题是在我的数据库CreditCardToken
中保存了,但是,我的应用程序只是冻结了。
为什么会发生这种情况,我该如何解决?
据我所知,执行时需要等待FirstOrDefaultAsync()
。
解决方案
不要同步等待async
调用,除非您完全了解上下文,否则请async
传播。
public async Task<ActionResult> IngresarTargeta(CreditCardViewModel creditCardViewModel)
{
var result = await MyClass.RegisterCardTokenAsync(creditCardToken)
这就是为什么
顶级方法调用
RegisterCardTokenAsync
(在 ASP.NET 上下文中)。RegisterCardTokenAsync
_dbContext.SaveChangesAsync()
通过调用(仍在上下文中)开始保存更改 。SaveChangesAsync
返回一个 uncompletedTask
,表示保存未完成。RegisterCardTokenAsync
等待Task
返回的SaveChangesAsync
. 上下文被捕获并将用于SaveChangesAsync
稍后继续运行该方法。SaveChangesAsync
返回一个 uncompletedTask
,表示该SaveChangesAsync
方法不完整。顶级方法在
Task
返回时同步阻塞SaveChangesAsync
. 这会阻塞上下文线程。
...
最终,
SaveChangesAsync
遗嘱完成。这完成了Task
由SaveChangesAsync
.继续 for
RegisterCardTokenAsync
现在准备好运行,它等待上下文可用(因此它可以在上下文中执行)。
这会导致死锁。顶级方法正在阻塞等待RegisterCardTokenAsync
完成的上下文线程,并RegisterCardTokenAsync
等待释放上下文以便它可以完成。
推荐阅读
- java - 制作动画和移动 JFrame
- php - 哪个更快,连接器或 PHP 原生函数
- angularjs - 在angularjs中的.html文件中刷新页面时调用方法
- ios - 在 didSelectRowAt indexPath 函数之外访问 IndexPath.row
- java - 在recyclerview中回收edittext
- swift - 如何实现一个符合相互关联协议之一的泛型类?
- jquery - 如何在jquery中取消选择选定的固定列数据表
- sql - SQL 查询中的 Microsoft.Azure.Documents.DocumentClientException
- python - 如何修复 rasberrypie3 python 中的“chrome 无法访问”和“DevToolsActivePort 文件不存在”错误
- node.js - 如何利用 Docker 在 Travis CI 上运行多种语言的测试