0

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

我正在尝试异步运行 Save 方法,到目前为止我已经这样做了。我只想知道这是否是异步调用 Save 方法的正确方法?await在 Task.Run... 之前是否正确?我是否还应该添加async我的保存方法:private 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
        ............................

    }
}
4

1 回答 1

2

我建议你阅读我的async介绍文章。

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

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

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

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

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;
}
于 2013-10-23T11:57:38.123 回答