Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用异步OnActionExecuting时:异步模块或处理程序在异步操作仍挂起时完成_C#_Asynchronous_Async Await_Asp.net Mvc 5.2 - Fatal编程技术网

C# 使用异步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()) 此时,我

我有一个控制器,它将OnActionExecuting重写为异步方法,如下所示:

protected override async void OnActionExecuting(ActionExecutingContext filterContext)
{
}
在该方法中,我调用了一些可等待的方法,例如
await db.Empresa.FindAsync(EmpresaID)
等待UserManager.FindByIdAsync(User.Identity.GetUserId())

此时,我收到错误:
ASP.NET控制器:异步模块或处理程序已完成,而异步操作仍处于挂起状态

是否可以将
OnActionExecuting
方法设置为异步?有办法解决这个问题吗


Jaime

否,它返回
void
not
Task
或其他可等待类型,因此调用代码将无法确定异步工作何时完成

如果您必须在操作执行中使用异步方法(因为实体框架具有同步等价物,所以它看起来不像您使用的那样),那么只有次优的解决方法可用

您将需要阻止当前线程,但需要注意不要由于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支持异步操作筛选器。