2013-10-23 42 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; 
}