簡體   English   中英

以異步方式覆蓋 OnActionExecuting

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM