C# 当前线程忙时,服务器端代码将数据推送到客户端浏览器Comet(编程)

C# 当前线程忙时,服务器端代码将数据推送到客户端浏览器Comet(编程),c#,asp.net,ajax,C#,Asp.net,Ajax,我正在写一个简单的网页,里面有一堆文本框和一个按钮控件。现在,当用户完成编辑此文本框上的值时,用户必须单击按钮,此按钮根据从客户端接收的数据(文本框)在服务器端代码上调用高度流程密集型算法 完成整个操作可能需要30到45分钟的时间,因此当前线程仍在button click事件处理程序函数中 该后台任务只提供一个事件,web页面订阅该事件以在每个处理阶段之后获取一些文本数据 我想知道是否有任何方法可以让用户了解该后台任务的最新进展。我有div元素来打印当前状态信息 所以我在寻找某种反向机制,然后是

我正在写一个简单的网页,里面有一堆文本框和一个按钮控件。现在,当用户完成编辑此文本框上的值时,用户必须单击按钮,此按钮根据从客户端接收的数据(文本框)在服务器端代码上调用高度流程密集型算法

完成整个操作可能需要30到45分钟的时间,因此当前线程仍在button click事件处理程序函数中

该后台任务只提供一个事件,web页面订阅该事件以在每个处理阶段之后获取一些文本数据

我想知道是否有任何方法可以让用户了解该后台任务的最新进展。我有div元素来打印当前状态信息

所以我在寻找某种反向机制,然后是“get”和“post”

我读过一些关于Comet(编程)的文章,但我找不到任何简单或明确的答案

提前感谢

也许最简单的方法是提交作业,然后通过简单的页面帖子获得id。该id对应于服务器端长时间运行的作业

然后,返回的页面可以通过HTTP元刷新机制自动刷新,服务器可以在刷新的页面中返回状态等。页面将每隔(比如)30秒使用id不断刷新,直到作业完成


这是一种蛮力机制,但很简单。此外,它还具有允许用户将页面添加到书签并离开/返回的优点。考虑到您的作业要运行30/45分钟,这一点可能很重要。

您使用“Comet”(又名Ajax推送或反向Ajax)的方法是正确的-Comet本质上是一个总括术语,用于描述服务器在客户端不触发事件的情况下将某些内容“推送”回客户端的能力。一些Ajax框架正在开始构建这一点,而且我也不想让它靠近金属,因为有很多不同的事情要考虑(不同的WebApp Server、线程模型等)。你可以看到StackOverflow有一些这样的功能,当你为一个给定的问题自己写一个新的答案时,它会通知你一个新的答案


现在,在您的情况下,考虑到服务器端处理的时间长度,我同意Brian的回答,您应该给正在运行的作业一个id,并使用更简单的刷新机制来检查它。如果希望添加服务器端推送的外观,可以每隔一段时间通过标准ajax查询服务器,以检查任务是否完成,而不是简单的刷新,并在通过ajax调用完成时更改页面。如果您的工作能够报告进度,那么标准ajax可以用该进度刷新您的div,而不需要服务器端推送。

我完全同意Brian Agnew的建议,但有一个可能的改进。由于您实际上是在执行服务器推送操作,因此可能需要考虑一个新的解决方案。现在,我要说的是一个警告——如果你真的只管理每30-45分钟完成一次的工作,那么这很可能是过火了。但是,它的优点是,用户完成后,您可以将结果推送给用户,如果用户不再连接,您可以执行其他操作(例如向他们发送通知电子邮件)。

这取决于:

  • 如果您需要在进程结束时立即得到通知,Comet(长轮询)适合您
  • 如果延迟是可以接受的(例如,系统在进程完成1分钟后通知您),那么AJAX定时器(轮询)就是您的选择
  • 请看基于框架的两种技术的三个示例:


  • 很抱歉,是Java吗?

    谢谢,伙计,您的建议无法立即应用,因为整个操作目前是同步的,但所需的twicks非常小,我将试一试。