如何在asp.net中实现长时间运行的任务

时间:2014-04-25 23:18:29

标签: c# asp.net multithreading progress long-running-processes

我正在实施一个ASP.Net 4.0应用程序,其中按钮点击1000将围绕规则进行评估。评估所有规则需要10分钟。

如何在网页上显示进度。

这应该允许用户执行其他任务,例如取消等。

评估完所有规则后,需要更新页面中的数据并显示一条消息。

如何在ASP.Net中实现此功能?

2 个答案:

答案 0 :(得分:2)

您可以使用MS的信号器框架实现此功能。我们这样做是为了我们产品的安装程序。也是一个漫长的过程。由于产品是开源的,您可以在以下位置检查实现:

https://github.com/VirtoCommerce/vc-community/blob/master/src/Presentation/FrontEnd/StoreWebApp/Areas/VirtoAdmin/Views/Install/Index.cshtml

希望这有帮助。

答案 1 :(得分:0)

在这种情况下,我的个人建议是使用简单的ajax请求

在示例中,您可以调用第一个加载调用来处理初始化任务

在示例幻想名称Session(“taksprogress”)=“0”中保存会话中的值到此任务 并且您将使用此值更新进度条

第二个在页面上启动一个计时器,每隔五秒检查一次计时器并报告更新只检查你的实际会话状态(“taskprogress”)。

当它返回您在此时定义的值时,您将向客户端显示您的消息。

它会帮助你更多,而且实现起来非常简单。 请注意,如果您要使用ashx文件,则必须在会话的读/写模式下启用accesso的权限。 还有很多其他方法可以用类,json响应,包括文本消息等:) 我希望这可以帮助您选择正确的选择方式。

嗨Shiva,根据你最后的评论,最好在这种情况下选择ajax假设这种情况:

  1. 按钮“START”对.aspx / ashx(我更喜欢)进行ajax调用,这需要注意运行长任务
  2. 按钮“CANCEL”,用于进行另一个ajax调用以停止长任务
  3. 进度条,将使用某些信息进行更新
  4. 此时你需要制作一些javascript函数来处理你需要更新进度条等等。
  5. 在示例中,您将有一个调用来启动任务以停止一个回复状态,您可以假设您在ashx文件中可以根据需要传递许多参数

    http://domain.com/ajax/longtask.ashx?task=start

    http://domain.com/ajax/longtask.ashx?task=update

    http://domain.com/ajax/longtask.ashx?task=cancel

    在这种情况下,你可以使用一个单独的ajax调用来完成所有的工作,面对你所说的任务你可以在javascript中使用一个switch case来详细说明。

    您还必须创建一个单一功能,以使计时器能够以定义的间隔调用服务,例如2秒1秒5秒

    当任务运行时(task = start),它将使用新值更新会话,而更新只会从会话中检索此数据

    如果取消任务,你将在会话中设置一个标志,告诉你的程序退出并通过json格式的ajax返回结果

    这就是全部

    检查你的逻辑,构造和类,以确保你可以用简单的方式实现这个logi。你也可以在例子MonitoringLongTask中创建一个自定义类,它暴露了几个信息,所以每次你需要沟通/后退你只需要更新“MonitoringLongTask”类属性。

    我希望它可以帮到你

    最新评论更新:

      

    不确定理解Siva,你的意思是你从表格发布一些数据然后评估可以运行吗?没有相同的东西或更好2个不同的ajax调用没有别的。第一个ajax调用发送数据到数据库并详细说明并在成功函数内返回ok或者失败进入ajax调用调用你的第二个函数启动任务绑定你可能创建的两个调用一个自定义令牌传递给第一个响应,它将被添加到第二个调用中,例如:firt call http://domain.com/ajax/lng.ashx?task=store&param1=0&param2=1等等,它将返回一个简单的令牌,例如一个guid或id从数据库中获取此特定任务并传递给它作为2个调用中的参数,如http://domain.com/ajax/lng.ashx?task=start&uid=yourtoken