【发布时间】:2022-02-02 15:10:35
【问题描述】:
在我的应用程序中,我有一个服务器,它提供了一个 REST-Api,我的 UI 可以与之通信。
现在我必须在服务器上启动一个长时间运行的进程,但我希望客户端不要等待服务器的响应。
我知道我可以直接触发并忘记调用后而不等待响应,但我需要在客户端知道服务器上的进程已正确启动。
所以我想到了以下几点:
[HttpPost]
[Route("startscan")]
public HttpResponseMessage StartScan()
{
Task.Factory.StartNew( () =>
{
//Do long running things here
});
return Request.CreateResponse(HttpStatusCode.OK);
}
所以我现在的问题是:我开始的任务会执行到底吗?问题的背景是,据我所知,每次调用都会创建一个控制器实例。因此,控制器的实例会在请求完成时终止,还是我开始的任务会运行到它结束。该任务有时可能需要 10 分钟或更长时间。
【问题讨论】:
-
对于每个请求,当响应完成时,您只会得到一个响应。您需要两个请求/响应。第一个请求将开始处理。第二个请求将返回响应结果。
-
我不需要这个请求的响应。为此,我有另一种方法。我只想完成第一个请求并让任务运行
-
好吧,如果您的控制器有任何依赖项用于继承您的任务;当控制器被处理时,正在运行您的任务的依赖项将不会存在,因此您的工作可能没有完成。
-
所以(对不起两行)你需要在一个新的单例服务中保持依赖项
标签: c# rest controller task