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

时间:2013-10-23 08:45:10

标签: c# asp.net-web-api

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

我正在尝试运行Save方法async,到目前为止我已经这样做了。我只是想知道这是否是异步调用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
        ............................

    }
}

1 个答案:

答案 0 :(得分:2)

我建议您阅读我的async intro帖子。

  

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

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

在服务器端,您应该避免Task.Run或其他任何队列工作到线程池。

  

我是否还应该在保存方法上添加async?

如果方法使用async关键字,则该方法应为await

如果您的数据库支持异步方法(例如,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;
}