2012-01-13 76 views
0

此刻,我的项目有一个方法如何从.Net中的线程向浏览器发送通知?

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将是一个开始)。

据我所知,回调在过程结束时被调用,所以我认为这将是一个理想的地方发送javascript到浏览器,但我不能想我该如何实现这一点。当过程结束时调用回调方法时,有没有人有任何想法可以实现一个非常基本的通知(msgbox,response.write等)到浏览器?谢谢

回答

1

我认为你需要颠倒过程流程的控制,因为我不认为有任何方法可以从Web服务器推回到Web浏览器。

为我们处理长期运行的事务一样,这是如下方式的大致轮廓:

启动Web服务器上的过程中,无论是通过回发或ajax请求。

Web服务器为请求生成一个唯一标识符,并触发后台工作人员或线程,或者在数据库表中为队列请求排队并处理服务。

如果启动了后台工作者或线程,则该请求的唯一标识符会记录在应用程序中的某个位置,通常位于数据库中以确保它在Web场或Web园中可用(而不是将其存储在缓存或静态变量中)。

一旦启动过程,Web服务器会将唯一ID返回给浏览器。

然后浏览器设置一个window.timeout循环,通过ajax调用或PageMethod定期检查请求的状态。

当过程完成后,无论成功还是失败,它更新与可能已产生的任何错误消息一起在唯一的ID原来拍摄的(再次,通常是一个数据库表)的位置状态。

下一次客户机超时火灾,它会发现过程已经完成,然后可以执行相应的操作(导航至不同的页面,显示错误消息,等等)。

我们已经成功地将这种模式用于几个长时间运行的活动,包括报告生成和数据合并。