是否保证线程将在aspnet中完成?

时间:2014-06-23 08:39:07

标签: c# asp.net multithreading

我在aspnet中有这个简单的代码:假设没有异常,也没有文件锁定,也没有进程终止:

    new Thread(()=>{
          Thread.sleep(15000);
         // GC.Collect(); 
          File.Write (...); // dummy file

    }).Start();

   // GC.Collect();

从我的测试中,文件始终创建。

问题


我不理解的情况是请求生命周期比线程执行短得多,但仍然有效。就这样 。这是我的主要问题

是否始终保证会创建文件?

Nb只是检查行为的一项测试。 此页面也是一个只有此代码的空白页面。我也知道加入会等待

2 个答案:

答案 0 :(得分:2)

不是。当IIS决定重新整理整个过程时,它将删除后台和前台线程。请参阅this answer

幸运的是,你可以确保它们不被打断。您可以通过实现IRegisteredObject接口告诉ASP.NET有关您的线程的信息。然后,您可以使用HostingEnvironment.RegisterObject注册您的对象。见The Dangers of Implementing Recurring Background Tasks In ASP.NET

答案 1 :(得分:1)

除非线程被中止或上述语句抛出异常,是的,它将始终被创建(将文件权限和IO问题排除在图片之外)。

线程可能被中止的原因:

  • (手动)应用程序池回收;
  • 请求放弃;
  • 申请失败。