红隼回复用户并继续处理



我有一个使用Kestrel的应用程序,我有一个相当长的(8+秒)函数要运行。最后,客户端返回生成的id。

我需要发生的是我们收到请求,立即为客户端生成id,然后释放客户端。因此,在客户心中,请求是"完成"的;但是对于我们的应用程序,它将继续在另一个线程(或同一线程无关)中处理请求

这就是我所做的

public void Configure(IApplicationBuilder app)
{
app
.UseMaxConcurrentRequests()
.Run(async (context) =>
{
try
{
// Generated id
string gid = GlobalMethods.GetUniqueKey(14);

var url = context.Request.Path.Value;
/*
Bunch of url manipulation
*/
// Long running task that I expect calling
// Task.Run would send it away
// But for some reason the client still waits here till this finishes
Task.Run(() => Routing(segments, requestFromBody, gid));

// I know this is what sends the response
// Back to the client and I even tried
// To put this at the very top of the method
// But it still waits for routing to finish
await context.Response.WriteAsync(gid);
}
catch (Exception ex)
{
Logger.Instance.ErrorLogBuffer.Add($"{ex.Message}{Environment.NewLine}{Environment.NewLine}{ex.StackTrace}");
}
});
}

检查代码中的注释

所以我尝试了几种不同的方法,如使Routing方法异步,不调用await

我就是弄不明白这一点,最重要的是我们尽快响应客户端并释放它们并继续处理请求

我已经注释掉了路由方法调用,看到对客户端的响应是闪电般的快,但无论如何,如果路由方法被调用,它等待它完成

我想我也应该注意到我使用的不是asp.net模板,我使用的是。net 6控制台应用程序

Task.Run应该正常工作。只要确保在将传入请求交给处理之前复制并说明它。

最新更新