如何从.Net中的线程向浏览器发送通知?

时间:2012-01-13 16:40:45

标签: asp.net vb.net multithreading delegates

目前,我的项目有一个方法

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等)有任何想法?感谢

1 个答案:

答案 0 :(得分:1)

我认为您需要反转对流程流的控制,因为我认为没有任何方法可以从Web服务器推送回Web浏览器。

我们处理长期运行事务的方式概述如下:

通过回发或ajax请求在Web服务器上启动该过程。

Web服务器为请求生成唯一标识符,并触发后台工作程序或线程,或者在数据库表中对请求进行排队,以便服务进行拾取和处理。

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

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

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

当进程完成(成功或失败)时,它会更新最初记录唯一ID的位置(同样,通常是数据库表)中的状态以及可能已生成的任何错误消息。

下次启动客户端超时时,它会发现该进程已完成,然后可以执行相应的操作(导航到其他页面,显示错误消息等)。

我们已成功将此模式用于多个长期运行的活动,包括报告生成和数据合并。