2009-07-02 48 views
0

我有一个asp.net页面 当加载此页面时,它创建了一个线程来执行某些操作 我的问题是: 如何在用户关闭页面时终止此线程? 我试过用“onUnload”事件 ,但它只是与javascript函数(据我所知) ,我们不能在JavaScript函数中使用asp.net代码 您有办法帮助我... 谢谢很多当页面关闭时运行asp.net函数

编辑: 这是很难解释什么,我试图做...的asp.net页面必须显示一条消息给用户,此消息必须直接出现,而无需刷新,所以我试图使用线程,听取等待消息,然后运行AJAX代码来显示消息。

回答

1

你不能。浏览器和代码隐藏(C#)生活在不同的世界中,一旦页面生命周期完成(在RenderComplete之后不久),服务器就完成了请求。
它将生成的HTML发送给客户端,永远不会回头看。

在JavaScript中的onunload事件,你可以发送AJAX请求到服务器,告诉它该用户离开页面,但是这将是非常不可靠,如果你靠的是专门为杀死线程你会有一个重大问题在你手上。

一般来说,你试图完成的事情会以另一种方式更好地完成 - 正如其他人所说的那样,让我们​​知道你正在尝试做什么,然后我们会给出建议。

+0

这是很难解释什么,我试图做 但我会尝试.. 的asp.net页面必须显示一条消息给用户 这个消息必须直接出现,而无需刷新 所以我试图使用一个线程侦听等待消息 ,然后运行AJAX代码来显示消息。 – Hany 2009-07-02 19:07:54

+1

在这种情况下,您可以让Ajax定期轮询服务器。 – 2009-07-02 19:12:24

0

由于您几乎无法控制客户端浏览器上发生的情况,因此启动一个依赖页面关闭进行清理的工作线程是一种糟糕的编码习惯。也许你可以重新考虑这个架构,或者至少说明这个工作线程实际在做什么,因此可以推荐一个更好的解决方案。

如果工作线程设置要做的工作具有清晰的代码完成路径,那么垃圾收集器将处理清理并且不需要担心。如果您使用线程池中的线程通过QueueUserWorkItem构造执行后台任务,那么一旦工作完成,线程将使其在池中再次可用,并且只要您确保妥善处置非托管资源(如果有的话)。

0

页面关闭时没有发送请求,所以开箱即用,答案是否定的。但是,您有几个选项。

一种方法是将JavaScript onUnload事件中的XmlHttpRequest(Ajax调用)发送到WebMethod。

另一种方法是在下一页面下载页面的下一页开始执行代码,该代码除了用户离开您的网站或关闭浏览器的情况之外。

最后,您可以使用服务器端事件,例如会话过期。

你究竟想要做什么?也许我们可以帮助想出一个更好的方法来实现它。

0

只是好奇:你正在运行什么样的线程进程?对于你的问题,你将能够捕获正在关闭的浏览器事件的唯一地方是在Javascript中......你可以做一个ajax回调服务器来杀死任何你正在运行的线程会议,但正如其他人所说,这是不可靠的。

总之,没有直接的方法来做你想做的事情。你可以期望的最好的方法是钩住Sesion_OnEnd事件。

0

麦克在评论中指出,你应该建立一个Web服务,一些JavaScript的网页上可以定期轮询 - 那么这将去interagate队列中,检查邮件,如果发现一个,显示给用户的消息。

此网站的功能与回答问题时非常相似 - 它有一个“心跳”javascript调用,用于轮询服务器寻找新答案 - 如果发现某些问题,顶部会出现橙色的消息栏的页面告诉你有新的答案,并且你想查看它们吗?

1

你可以用它与阿贾克斯

首先,你赶上onunload事件脚本页面上工作PageMethods做到这一点:

body onunload='javascript:PageMethods.UnloadForm();' 

然后ü使您必须添加对ScriptManager的AJAX PageMethods您页:

asp:ScriptManager ID="ScriptManager1" EnablePageMethods="true" 
    runat="server" 

后,您将创建PageMethods代码隐藏方法在C#:

[System.Web.Services.WebMethod] 
    public static void UnloadForm() 
    { 
// your stuff 
} 

希望这会帮助你。

我的实际pb是Onunload事件生成没有关闭我的页面原因的AJAX计时器。但是如果你不添加计时器,你不应该有这个pb。