ASP.NET Web API 消息处理程序异步

本文关键字:程序 异步 消息处理 API NET Web ASP | 更新日期: 2023-09-27 18:36:34

我有一个自定义的 ASP.NET Web API 消息处理程序,对于收到的每个请求,它将请求方法和请求 uri 保存到自定义数据库中:

我正在尝试异步运行 Save 方法,到目前为止我已经完成了。我只想知道这是否是异步调用 Save 方法的正确方法?在 Task.Run 之前有await是否正确... ?我是否也应该在我的保存方法上添加asyncprivate async void Save(

有人可以告诉我是否可以代替TaskCompletionSource<T>()

public class CustomHandler : DelegatingHandler
{
    protected async override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,
        CancellationToken cancellationToken)
    {            
        var response = await base.SendAsync(request, cancellationToken);         
        await Task.Run(() => Save(request), cancellationToken);
        return response;
    }
    private void Save(HttpRequestMessage request)
    {            
        var method = request.Method.Method;
        var url = request.RequestUri.ToString();
        // here is saved to custom db code removed
        ............................
    }
}

ASP.NET Web API 消息处理程序异步

我建议您阅读我async介绍文章。

我只想知道这是否是异步调用 Save 方法的正确方法?

如果这是一个 UI 应用程序,await Task.Run可以接受但不理想。但是,由于这是一个 ASP.NET 应用程序,因此await Task.Run一点也不好。

在服务器端,应避免队列对线程池起作用Task.Run或其他任何内容。

我还应该在我的保存方法上添加异步吗?

仅当方法使用 await 关键字时,才应async该方法。

如果您的数据库支持异步方法(例如 EF6),则可以在 Save 方法中使用这些方法,这将要求将其标记为 async(并且应返回 Task )。然后你可以这样称呼它:

private async Task SaveAsync(HttpRequestMessage request);
protected async override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{            
    var response = await base.SendAsync(request, cancellationToken);         
    await SaveAsync(request);
    return response;
}

但是,如果您的数据库不支持 async ,那么您应该同步调用它:

private void Save(HttpRequestMessage request);
protected async override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{            
    var response = await base.SendAsync(request, cancellationToken);         
    Save(request);
    return response;
}