首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

ASP.NET MVC 異步 Action 擴展實現:從原理到 200 行核心代碼

     編輯:關於ASP.NET

異步請求處理價值

IO 密集型場景(數據庫、Web Service、文件讀寫)釋放執行緒,提升吞吐量。ASP.NET MVC 1.0/2.0 缺乏原生支持,需自行擴展。

請求處理管道改造點

Route → MvcRouteHandler → MvcHandler → IController.Execute → IActionInvoker.InvokeAction

關鍵切入點:IAsyncController、IAsyncActionInvoker、自定義 MvcRouteHandler。

核心擴展組件

1. 異步控制器基類

public abstract class AsyncController : Controller, IAsyncController {
    public AsyncManager AsyncManager { get; } = new AsyncManager();
    
    public IAsyncResult BeginExecute(RequestContext context, AsyncCallback callback, object state) {
        AsyncManager.OutstandingOperations.Increment();
        return base.BeginExecute(context, callback, state);
    }
    
    public void EndExecute(IAsyncResult asyncResult) {
        base.EndExecute(asyncResult);
        AsyncManager.OutstandingOperations.Decrement();
    }
}

2. 異步管理器

public class AsyncManager {
    public OutstandingOperationsTracker OutstandingOperations { get; } = new OutstandingOperationsTracker();
    public IDictionary Parameters { get; } = new Dictionary();
    
    public void Sync(Action action) {
        OutstandingOperations.Increment();
        ThreadPool.QueueUserWorkItem(_ => {
            try { action(); }
            finally { OutstandingOperations.Decrement(); }
        });
    }
}

3. 異步 Action 調用器

public class AsyncActionInvoker : ControllerActionInvoker {
    protected override ActionResult InvokeActionMethod(ControllerContext ctx, ActionDescriptor desc, IDictionary parameters) {
        var asyncController = ctx.Controller as AsyncController;
        if (asyncController == null) return base.InvokeActionMethod(ctx, desc, parameters);
        
        var asyncResult = desc.BeginExecute(asyncController, parameters, null, null);
        asyncController.AsyncManager.OutstandingOperations.Increment();
        
        return new AsyncActionResult(asyncResult, asyncController.AsyncManager);
    }
}

public class AsyncActionResult : ActionResult {
    private readonly IAsyncResult _asyncResult;
    private readonly AsyncManager _manager;
    
    public override void ExecuteResult(ControllerContext context) {
        _manager.OutstandingOperations.Decrement();
        // 異步完成後繼續管道...
    }
}

使用模式

public class HomeController : AsyncController {
    public void LongRunning() {
        AsyncManager.OutstandingOperations.Increment();
        Task.Run(() => {
            // 耗時操作:數據庫、Web API、文件處理
            var data = _service.GetHeavyData();
            AsyncManager.Parameters["result"] = data;
            AsyncManager.OutstandingOperations.Decrement();
        });
    }
    
    public ActionResult LongRunningCompleted() {
        var data = AsyncManager.Parameters["result"] as HeavyData;
        return View(data);
    }
}

ASP.NET MVC Futures 官方方案對比

官方 AsyncController、AsyncManager、MapAsyncRoute 提供規範化實現,建議生產環境直接引用 Microsoft.Web.Mvc。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved