我有一个自定义的ASP.NET Web API消息处理程序,对于每个请求,它将保存请求方法并请求uri到自定义数据库:
我正在尝试运行Save方法async,到目前为止我已经这样做了。我只是想知道这是否是异步调用Save方法的正确方法?在Task.Run之前拥有await
是否正确?我还应该在保存方法上添加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
............................
}
}
答案 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;
}