C# ASP.NET Web API消息处理程序异步
我有一个自定义ASP.NET Web API消息处理程序,对于每个请求,它都会将请求方法和请求uri保存到自定义数据库: 我正在尝试异步运行Save方法,到目前为止我已经这样做了。我只是想知道这是否是异步调用Save方法的正确方法?在任务之前让C# ASP.NET Web API消息处理程序异步,c#,asp.net-web-api,C#,Asp.net Web Api,我有一个自定义ASP.NET Web API消息处理程序,对于每个请求,它都会将请求方法和请求uri保存到自定义数据库: 我正在尝试异步运行Save方法,到目前为止我已经这样做了。我只是想知道这是否是异步调用Save方法的正确方法?在任务之前让等待是否正确。运行?我是否应该在我的保存方法中添加async:private async void save( 有人能告诉我是否可以使用TaskCompletionSource() public class CustomHandler : Delegati
等待是否正确。运行?我是否应该在我的保存方法中添加async
:private async void save(
有人能告诉我是否可以使用TaskCompletionSource()
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
............................
}
}
公共类CustomHandler:DelegatingHandler
{
受保护的异步重写任务SendAsync(HttpRequestMessage请求,
取消令牌(取消令牌)
{
var response=await base.sendaync(请求、取消令牌);
等待任务。运行(()=>保存(请求),取消令牌);
返回响应;
}
私有无效保存(HttpRequestMessage请求)
{
var method=request.method.method;
var url=request.RequestUri.ToString();
//此处保存为自定义数据库,代码已删除
............................
}
}
我建议你阅读我的帖子
我只是想知道这是否是异步调用Save方法的正确方法
如果这是一个UI应用程序,wait Task.Run
可以接受,但并不理想。但是,由于这是一个ASP.NET应用程序,wait Task.Run
一点也不好
在服务器端,您应该避免执行任务。运行或将工作队列排入线程池的任何其他操作
我还应该在save方法中添加async吗
如果方法使用wait
关键字,则该方法只能是async
如果您的数据库支持异步方法(例如),则可以使用保存
方法中的方法,该方法要求将其标记为异步
(并应返回任务
)。然后您可以这样调用它:
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;
}
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;
}