![](/img/trans.png)
[英]Async OnActionExecuting in ASP.NET Core's ActionFilterAttribute
[英]overriding OnActionExecuting as async
我有一個 Controller 將 OnActionExecuting 重寫為異步方法,這樣:
protected override async void OnActionExecuting(ActionExecutingContext filterContext)
{
}
在該方法中,我調用了一些可等待的方法,例如
await db.Empresa.FindAsync(EmpresaID);
和
await UserManager.FindByIdAsync(User.Identity.GetUserId());
有了這個,我收到了錯誤:
ASP.NET Controller:異步模塊或處理程序已完成,而異步操作仍處於掛起狀態。
是否可以將OnActionExecuting
方法設為異步? 有沒有辦法解決這個問題?
不,它返回void
而不是Task
或其他可等待類型,因此調用代碼將無法確定異步工作何時完成。
如果您必須在OnActionExecuting
中使用異步方法(並且看起來不像這樣做,因為 Entity Framework 具有同步等效項),則只有次優的解決方法可用。
您將需要阻塞當前線程,但需要注意不要因為 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
相關的開銷。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.