我正在尝试实现一个功能,其中 SQL Server 上有一个存储过程,必须从 ASP MVC 应用程序调用并在后台处理(这可能需要很长时间,因为它远程调用另一个存储过程来处理 excel文件存储在服务器上)。但是最后一个 HTTP 请求的响应应该返回给客户端,这样 UI 就不会挂起等待处理。
我尝试了很多不同的方法,但用户界面仍然没有立即响应。
我试过 BackgroundWorker
但它不允许主线程在完成处理之前响应客户端,
我也试过:
Thread.QueueUserWorkItem(delegate { //method which performs stored procedure calls//
});
它仍然没有返回响应并且 HttpContext.Current
在后台线程中不可用。
也许有一种方法可以启动后台处理,暂停它让主线程向浏览器返回响应,然后恢复后台线程以使用存储过程调用进行所有处理?
我错过了什么吗?
有人可以告诉我如何解决这个问题吗?将不胜感激。
最佳答案
我最终得到的结果在我的案例中效果很好。我不确定效率,但它非常有效。因此,调用存储过程的代码我放在一个单独的线程上,这样主线程就完成了,而后台调用的处理发生在一个单独的线程上,并在一段时间后成功完成。同时 UI 可用,因此用户可以发出另一个请求,该请求也将以相同的方式处理。我测试了三个请求。一个接一个重叠,这意味着当第一个请求在后台处理时,我提交了一个又一个。 UI 立即响应,所有工作都已完成。
// ...main thread is working here
//put a call to stored procedure on a separate thread
Thread t = new Thread(()=> {
//call stored procedure which will run longer time since it calls another remote stored procedure and
//waits until it's done processing
});
t.Start();
// ...main thread continue to work here and finishes the request so it looks for user as the response is coming right away, all other stuff is being processed on that new thread so user even doesn't suspect
关于c# - 在后台运行任务但在 ASP MVC Web 应用程序中返回响应给客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24828812/