代码中的线程落后

时间:2010-06-23 11:41:58

标签: c# .net asp.net multithreading

我有一个aspx.cs页面和相应的aspx页面。加载此页面时,以及按钮事件,我创建了一个运行一段时间然后退出的线程。我想知道谁是这个主题的父母。

让我们说线程正在运行,我关闭了这个页面,这个线程会退出吗?

我做了这个,但线程一直在运行。

实际上我想做的是在用户关闭页面时清理任务。

这个帖子的w3wp父吗? 如果没有那么,如果我关闭这个页面谁将成为父母?

3 个答案:

答案 0 :(得分:1)

线程没有父母。特别是,父母的“死亡”对他们来说毫无意义。

您可能遇到的问题是您的线程方法可能依赖于特定于页面或请求的数据。依赖于HttpContext的任何内容都会成为问题,因为在请求结束后,线程仍然可以运行,并且HttpContext不再有效。线程依赖于页面上的任何内容也是如此,因为在请求完成后页面将被销毁。

请参阅“Wicked Code: Asynchronous Pages in ASP.NET 2.0”以了解ASP.NET页面中异步操作的良好模式。这就是意图与异步世界交互的页面。

答案 1 :(得分:0)

建议不要代表用户运行线程。如果可能,我建议您查看异步页面。

如果你真的需要一个线程,那么你必须按会话ID创建一个线程查找(例如,Dictionary<string, Thread>)。启动线程时,将其存储在字典中(当前会话ID为Session.SessionID)。当会话结束时(Global.aspx中的Session_OnEnd),告诉线程停止并将其从字典中删除。

请记住锁定字典对象。

答案 2 :(得分:0)

由于您的浏览器和网络服务器没有连接,除了您实际执行请求的奇数次,ASP.NET或IIS无法检测您的浏览器窗口何时关闭。你唯一能做的就是检测会话结束。既然你表明你只想做清理工作,因为我不确定在Session_OnEnd处理程序中进行长时间运行是否是个好主意,所以你可能想要使用线程池:

protected void Session_OnEnd(object sender, EventArgs e)
{
    ThreadPool.QueueUserWorkItem(CleanUpSession, myStateObject);
}

private void CleanUpSession(object state)
{
    // do your clean-up here
}