目前,我的项目有一个方法
do_quote(quoteid,userid)
此方法需要一两分钟,然后重定向到另一个页面。
这已经被重写,现在它在后台运行并重定向到另一个页面,同时do_quote的线程继续。 - 这很好。
在default.aspx页面的button_click事件中:
Dim d as New do_quote_delegate(AddressOf do_quote)
d.BeginInvoke(quoteid,userid, New AsyncCallback(AddressOf Callback),d)
Response.redirect("results.aspx")
与
有关Delegate Sub do_quote_delegate(Byval quoteid as integer, Byval userid as integer)
Public Sub do_quote(Byval quoteid as integer, Byval userid as integer)
' Do something for several seconds
End Sub
Public Sub Callback(Byval ar As IAsyncResult)
ar.AsyncState.EndInvoke(ar)
' i think i need something here to trigger a notification
End Sub
这基本上可以满足我的需求,用户可以在网站上进行操作,do_quote方法在后台运行并成功完成任务。
我想要的是在do_quote完成时向浏览器发送通知。理想情况下,我想更改主页上div的文本(但只是返回一个ALERT javascript msgbox将是一个开始)。
据我所知,Callback在流程结束时被调用,所以我认为这将是一个向浏览器发送javascript的理想场所,但我想不出如何实现这一点。有没有人对如何在进程结束时调用Callback方法时向浏览器实现一个非常基本的通知(msgbox,response.write等)有任何想法?感谢
答案 0 :(得分:1)
我认为您需要反转对流程流的控制,因为我认为没有任何方法可以从Web服务器推送回Web浏览器。
我们处理长期运行事务的方式概述如下:
通过回发或ajax请求在Web服务器上启动该过程。
Web服务器为请求生成唯一标识符,并触发后台工作程序或线程,或者在数据库表中对请求进行排队,以便服务进行拾取和处理。
如果启动后台工作程序或线程,请求的唯一标识符将记录在应用程序的某个位置,通常在数据库中,以确保在Web场或Web园中可用(而不是存储)它在缓存或静态变量中。)
启动流程后,Web服务器会将唯一ID返回给浏览器。
然后,浏览器会设置一个window.timeout循环,通过ajax调用或PageMethod定期检查请求的状态。
当进程完成(成功或失败)时,它会更新最初记录唯一ID的位置(同样,通常是数据库表)中的状态以及可能已生成的任何错误消息。
下次启动客户端超时时,它会发现该进程已完成,然后可以执行相应的操作(导航到其他页面,显示错误消息等)。
我们已成功将此模式用于多个长期运行的活动,包括报告生成和数据合并。