ASP.NET Web API 消息处理程序异步
本文关键字:程序 异步 消息处理 API NET Web ASP | 更新日期: 2023-09-27 18:36:34
我有一个自定义的 ASP.NET Web API 消息处理程序,对于收到的每个请求,它将请求方法和请求 uri 保存到自定义数据库中:
我正在尝试异步运行 Save 方法,到目前为止我已经完成了。我只想知道这是否是异步调用 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
............................
}
}
我建议您阅读我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;
}