Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET Web API消息处理程序异步_C#_Asp.net Web Api - Fatal编程技术网

C# ASP.NET Web API消息处理程序异步

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

我有一个自定义ASP.NET Web API消息处理程序,对于每个请求,它都会将请求方法和请求uri保存到自定义数据库:

我正在尝试异步运行Save方法,到目前为止我已经这样做了。我只是想知道这是否是异步调用Save方法的正确方法?在任务之前让
等待
是否正确。运行?我是否应该在我的保存方法中添加
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;
}