C# 使用异步OnActionExecuting时:异步模块或处理程序在异步操作仍挂起时完成
我有一个控制器,它将OnActionExecuting重写为异步方法,如下所示:C# 使用异步OnActionExecuting时:异步模块或处理程序在异步操作仍挂起时完成,c#,asynchronous,async-await,asp.net-mvc-5.2,C#,Asynchronous,Async Await,Asp.net Mvc 5.2,我有一个控制器,它将OnActionExecuting重写为异步方法,如下所示: protected override async void OnActionExecuting(ActionExecutingContext filterContext) { } 在该方法中,我调用了一些可等待的方法,例如await db.Empresa.FindAsync(EmpresaID)和等待UserManager.FindByIdAsync(User.Identity.GetUserId()) 此时,我
protected override async void OnActionExecuting(ActionExecutingContext filterContext)
{
}
在该方法中,我调用了一些可等待的方法,例如await db.Empresa.FindAsync(EmpresaID)
和等待UserManager.FindByIdAsync(User.Identity.GetUserId())代码>
此时,我收到错误:ASP.NET控制器:异步模块或处理程序已完成,而异步操作仍处于挂起状态
是否可以将OnActionExecuting
方法设置为异步?有办法解决这个问题吗
Jaime否,它返回void
notTask
或其他可等待类型,因此调用代码将无法确定异步工作何时完成
如果您必须在操作执行中使用异步方法(因为实体框架具有同步等价物,所以它看起来不像您使用的那样),那么只有次优的解决方法可用
您将需要阻止当前线程,但需要注意不要由于ASP.NET的同步上下文而导致死锁
一个选项是在线程池上运行异步代码:
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
var task = Task.Run(async () => db.Empresa.FindAsync(EmpresaID));
var result = task.Result;
}
实际上,这比简单地使用db.Empresa.Find(EmpresaID)
效率要低,因为Task.Run
会带来开销。我最终替换了对EF中同步对应项的所有异步调用。注意:ASP.NET Core支持异步操作筛选器。