处理长任务时请求超时错误

时间:2015-01-29 22:18:02

标签: c# asp.net multithreading asynchronous

我有一个带有一个按钮的c#asp.net管理系统,该按钮调用SQL Server查询以获得多种语言的90,000个文本字符串并分类为多个部分。这又被排序并且在保存为.ZIP之前制作了150个二进制文件,并通过电子邮件向用户发送结果。处理此结果并通过电子邮件发送结果的总时间约为6分钟。在这段时间里,网页坐着等待整个过程完成。我希望能够按下启动过程按钮,然后在我继续使用Web管理系统时允许它在后台工作,但我不确定这样做的最有效方法是什么。我最初创建了一个asmx文件,认为这可以工作,但结果是一样的,所以我现在看着async和await。任何人都可以给我任何指示,让我知道我是否在正确的轨道上。我目前没有得到任何回报,让我知道该过程已成功完成,因为我可以通过向用户发送电子邮件来说明出错。原因是用户可以在任意数量的页面上。

1 个答案:

答案 0 :(得分:0)

可能有几种方法可以解决这个问题。您的选项将根据您使用的.NET版本而有所不同,因此我不会直接发布代码;但是,您可以使用ASMX Web服务,WCF,MVC等实现我描述的概念。

启动 - 投票方法

针对此类问题的经典回答是实施StartSomething()方法和GetProgress()方法。使用基于ASMX的Web服务is presented here的这种方法的一个非常简单的示例。

在该示例中,使用一种服务方法在后台线程上启动进程。我自己,我会改变这个例子,让start方法向客户端返回一个值来识别启动了哪个后台进程,因为你可以一次进行几次。

然后,客户端可以调用单独的方法来获取进度更新,并继续轮询直到该过程完成。

why you should prefer to do lengthy background processing in a non-IIS service有很多原因。我建议使用Windows服务来保护自己免受IIS的影响 - 在一项大工作中随机重启应用程序池。

<强>的WebSockets

您需要进行一些探索的另一个选择是使用WebSockets,它允许服务器在流程完成时联系现代浏览器。这种方法的主要优点是客户端不需要忙于轮询服务以进行更新。它的主要缺点是WebSockets足够新,以至于仍有大量浏览器无法成为此类服务的客户端。

祝你好运!