【问题标题】:Is it guaranteed that a thread will complete in aspnet?是否保证一个线程将在 aspnet 中完成?
【发布时间】:2014-06-24 14:02:15
【问题描述】:

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

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

    }).Start();

   // GC.Collect();

根据我的测试,该文件是总是创建的。

问题

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

是否总是保证文件会被创建?

请注意,这只是检查行为的测试。 该页面也是一个只有此代码的空页面。我也知道加入会等待

【问题讨论】:

  • 不清楚您认为可能会发生什么来阻止这种情况。是的,该进程可能会被杀死。是的,可能存在异步异常。是的,该文件可能正在其他地方使用。不,正在执行的线程不会被垃圾回收 - 这实际上是您所担心的吗?如果有,请在问题中说明清楚。
  • Jon ,已编辑。假设没有异常,也没有锁定
  • 那么,您又在考虑什么替代方案?如果您担心垃圾收集,正如您的代码暗示,您应该这样说。
  • 如果没有异常或其他问题,您关心的问题在哪里?
  • 乔恩,帕特里克 - 我不理解的场景是请求生命周期比线程执行短得多,但它仍然有效。就这样 。这是我的主要问题

标签: c# asp.net multithreading


【解决方案1】:

事实并非如此。当 IIS 决定回收整个进程时,它将关闭后台和前台线程。见this answer

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

【讨论】:

  • @RoyiNamir 我找到了有关前台线程的来源 - 请参阅我的更新答案。
  • 您能解释一下为什么 - 将其更改为 backgroundThread=true - 仍然有效吗?主请求不应该终止所有子线程吗?
  • 还有——你怎么解释这个?这与我的测试相矛盾:stackoverflow.com/questions/23483091/…
  • @RoyiNamir ASP.NET 不一定会在请求结束时终止所有后台/前台线程(您已创建)。可能会发生,但不一定发生在每个请求之后。
【解决方案2】:

除非线程被中止或上述语句抛出异常,是的,它总是会被创建(不考虑文件权限和 IO 问题)。

线程可能中止的原因:

  • (手动)应用程序池回收;
  • 请求已放弃;
  • 应用程序崩溃。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-23
    • 2022-01-20
    • 1970-01-01
    • 2013-01-14
    • 1970-01-01
    • 2019-12-15
    • 2012-03-13
    • 2023-04-04
    相关资源
    最近更新 更多