2013-10-23 44 views
0

我有一个自定义的ASP.NET Web API的消息处理程序,对于自带这将节省的请求方法和请求URI到自定义数据库的每个请求:的ASP.NET Web API的消息处理异步

我想运行Save方法异步,我已经完成了这一点。我只想知道这是否是异步调用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 
     ............................ 

    } 
} 

回答

2

我建议你阅读我的async intro职务。

我只是想知道这是否是异步调用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; 
}