Pau*_*aul 8 c# asp.net-mvc multithreading
我正在尝试实现一种功能,其中SQL Server上存在必须从ASP MVC应用程序调用并在后台处理的存储过程(可能需要很长时间,因为它远程调用另一个存储过程来处理存储在其上的excel文件服务器).但是最后一个HTTP请求的响应应该返回给客户端,因此UI不会挂起等待处理.
我尝试了很多不同的方法,但UI仍然没有立即响应.
我试过BackgroundWorker但它不允许主线程在完成处理之前回复客户端,我也尝试过:
Thread.QueueUserWorkItem(delegate { //method which performs stored procedure calls//
});
Run Code Online (Sandbox Code Playgroud)
它仍然没有返回响应,并且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
Run Code Online (Sandbox Code Playgroud)
我将引用 Stephan Clearys 的精彩文章:
当您在服务器端使用 async(例如,使用 ApiController)时,您可以将每个 Web 请求视为异步操作。但是当你屈服时,你只屈服于 web 服务器线程池,而不是客户端。HTTP 只允许单个响应,因此只有在请求完全完成时才能发送响应。
基本上,这不符合 HTTP 协议,其中每个请求只有一个响应。
这可以通过多次调用 ASP.NET 服务来实现,其中请求立即返回唯一 ID,客户端可以多次查询该 ID 以获取进度。您可以查看SignalR以获取有关此类实现的帮助:
什么是 SignalR 和“实时网络”功能?它能够让您的服务器端代码实时将内容推送到连接的客户端。
| 归档时间: |
|
| 查看次数: |
13341 次 |
| 最近记录: |