【发布时间】:2014-09-08 20:04:19
【问题描述】:
我有一个具有 SaveAsync 方法的 Repository 类。
public async virtual Task<Result<int>> SaveAsync(T entity, ActionType actionType)
{
//some binding for return object
try
{
await DbContext.SaveChangesAsync().ConfigureAwait(false);
}
catch (Exception e)
{
//logging
}
return retVal;
}
以及调用 SaveAsync 方法的 MVC 控制器类:
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
var entity = //getting entity
Repository.SaveAsync(entity, ActionType.Update).GetAwaiter().GetResult();
base.OnActionExecuted(filterContext);
}
调试挂起在 Repository.SaveAsync(entity, ...) 行。 我已阅读 an article 关于 Task.Result 死锁问题。但是文章上的解决方案不适用于我的代码。
---更新问题
protected override void OnSaveExecuted(UserGroup entity, Result<int> operationResult, ref ActionResult actionResult)
{
//Execute actions if UserGroup saving operation was successfully completed
if (!operationResult.HasError)
{//someactions
operationResult = Repository.SaveAsync(entity, ActionType.Update).GetAwaiter().GetResult();
}
base.OnSaveExecuted(entity, operationResult, ref actionResult);
}
【问题讨论】:
-
为什么不等待 SaveAsync?
-
@NedStoyanov OnActionExecuted 没有异步标记。 ChildActions 有同样的问题,它们不支持 async/await。
-
@phood2009,您不需要在基类中包含
async就可以将async添加到嵌套类中被覆盖的方法中。 -
如果您无法摆脱
ref参数,可能值得提供Save的同步版本并调用它。这与阻塞结果相同,但没有死锁。当然,您不会获得异步的好处。 -
您试图通过阻止任务来作弊。如果这是一件有用的事情,那么框架会自动为您阻止并且每次都这样做。
标签: c# async-await entity-framework-6