【问题标题】:Foreground thread not holding up application when I restart the AppDomain当我重新启动 AppDomain 时,前台线程没有阻止应用程序
【发布时间】:2012-07-12 20:53:18
【问题描述】:

我在 MSDN 上读到,前台线程和后台线程之间的区别在于,应用程序在其所有前台线程都终止之前无法终止,而它不会费心等待后台线程。我决定尝试一下,只是为了更好地理解线程。

Thread t = new Thread(Work);  //Work() just has the thread sleep for a long time
t.IsBackground = false; //make it a foreground thread
t.Start();
while(true)
{
    if(Session["checker"] != null)
    {
        Session["checker"] = true;
        System.Diagnostics.Debug.Write("I'm here!");
    }
}

我使用会话变量来了解 AppDomain 是否已重新启动,因为会话在 AppDomain 重新启动时被清除。

所以当我保存 web.config 文件时,它应该触发 AppDomain 重新启动,这应该要求它等待我长时间运行的线程 t,因为 t 正在前台运行。但是,当我触摸 web.config 文件时,会直接清除我的 Session["checker"] 并打印出“我在这里!”,所以我知道我的应用程序没有等待我的线程。

我是否误解了前台线程应该如何工作? AppDomain 重启不应该等待我的线程完成执行,然后再开始清除我的会话变量吗?

谢谢

【问题讨论】:

  • ASP.NET 将在回收应用程序池时终止所有线程。不确定 ASP.NET 是否在后台线程和前台线程之间有明确的区别(尽管您可能会发明一个,只要有足够的创造力)。

标签: c# asp.net multithreading


【解决方案1】:

请注意语句“应用程序在其所有前台线程都终止之前无法终止”中的“应用程序”一词。在回收的情况下,应用程序不会终止。在回收过程中,ASP.NET 正在卸载旧的 AppDomain 并加载新的 AppDomain。一切都在单个进程中完成。进程没有终止。在 AppDomain 卸载范围内,所有线程(后台和前台)都被杀死。 因此,ASP.NET 在回收期间不会等待前台线程完成。 尝试简单的控制台应用程序,它在 Main 方法中创建一个前台线程。它会一直工作到线程终止。

【讨论】:

  • 谢谢拉曼,我曾假设应用程序终止是 AppDomain 卸载的一部分。我猜不是:)
猜你喜欢
  • 2012-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-24
  • 2018-01-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多