【问题标题】:How to send a notification to browser from a thread in .Net?如何从.Net中的线程向浏览器发送通知?
【发布时间】:2012-01-13 16:40:44
【问题描述】:

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

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 发送到浏览器的理想场所,但我想不出我该如何实现这一点。当在进程结束时调用 Callback 方法时,是否有人对我如何向浏览器实现非常基本的通知(msgbox、response.write 等)有任何想法?谢谢

【问题讨论】:

    标签: asp.net vb.net multithreading delegates


    【解决方案1】:

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

    我们处理此类长时间运行事务的方式大致如下:

    通过 postback 或 ajax 请求在 Web 服务器上启动进程。

    网络服务器为请求生成一个唯一标识符,并触发后台工作程序或线程,或将请求排队到数据库表中以供服务获取和处理。

    如果启动了后台工作程序或线程,则请求的唯一标识符会记录在应用程序的某处,通常在数据库中,以确保它在网络农场或网络花园的情况下可用(而不是存储它在缓存或静态变量中)。

    一旦进程启动,网络服务器将唯一的 id 返回给浏览器。

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

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

    下次客户端超时触发时,它会发现进程已完成,然后可以执行适当的操作(导航到不同的页面、显示错误消息等)。

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

    【讨论】:

      猜你喜欢
      • 2016-02-14
      • 1970-01-01
      • 2018-04-27
      • 1970-01-01
      • 2021-10-24
      • 1970-01-01
      • 2017-02-21
      • 1970-01-01
      相关资源
      最近更新 更多