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

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

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

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

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

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

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

它不是。 当IIS决定重新整理整个过程时,它将删除后台和前台线程。 看到这个答案 。

幸运的是,你可以确保它们不被打断。 您可以通过实现IRegisteredObject接口告诉ASP.NET有关您的线程的IRegisteredObject 。 然后,您可以使用HostingEnvironment.RegisterObject注册您的对象。 请参阅ASP.NET中实现重复后台任务的危险

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

线程可能被中止的原因:

  • (手动)应用程序池循环;
  • 要求放弃;
  • 应用程序崩溃。