线程被中止错误

Posted

技术标签:

【中文标题】线程被中止错误【英文标题】:Thread being aborded error 【发布时间】:2009-04-30 10:03:33 【问题描述】:

我们有一个可以创建电子书的应用程序。 此应用程序有一个创建 AIR 文件的导出模块,但这可能需要一段时间(有些书有 2500 页)。 如果我们导出,我们会收到以下错误:

Thread was being aborted. 
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.Threading.ThreadAbortException: Thread was being aborted.

Source Error: 
An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below. 

Stack Trace: 

[ThreadAbortException: Thread was being aborted.]
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +501
   System.Web.ApplicationStepManager.ResumeSteps(Exception error) +564
   System.Web.HttpApplication.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) +141
   System.Web.HttpRuntime.ProcessRequestInternal(HttpWorkerRequest wr) +436

我已将我的运行时执行超时更改为 3600 秒,但它一直在 3 分钟左右崩溃。 所以它与时间有关......每次我们接近它崩溃的 3 分钟时,我希望有人能帮助我。

【问题讨论】:

这是如何托管的?在共享主机环境中?还是专用/内部? 【参考方案1】:

我认为 Paul 关于异常原因的说法是正确的。 IIS 和 ASP.NET 都具有限制请求可以花费的最长时间的设置。对于 ASP.NET,它位于 Machine.Config 文件中(查找 httpRuntime 元素,executionTimeout 属性)。在我的开发机器上设置为 90 秒。

但是,我不建议您更改该设置,因为它可以确保您的应用程序不会因错误的请求而挂起。

长时间运行的任务应该使用异步执行。通过异步执行,实际工作在单独的线程上处理。这释放了处理请求的线程来处理其他请求,这对您的应用程序的整体性能有好处。

有一些关于此的好文章。例如:http://msdn.microsoft.com/en-us/magazine/cc163725.aspx

【讨论】:

【参考方案2】:

通常,此错误实际上是由 OutOfMemory 异常引起的。 是否有可用的 InnerException?

【讨论】:

【参考方案3】:

IIS 具有“失控”线程保护功能,如果线程/应用程序域运行时间过长,它会终止它。

【讨论】:

有一些方法可以控制这些设置,但我实际上并不知道它们是什么。我自己刚刚被这个问题击中并且知道它存在。您必须在 IIS 站点周围挖掘以获取有关配置何时回收工作进程的帮助。

以上是关于线程被中止错误的主要内容,如果未能解决你的问题,请参考以下文章

我的文件由于线程而被锁定,即使中止它也没有被终止

C#错误之 System.Threading.ThreadAbortException:正在中止线程

std::thread,在线程中抛出异常会导致 Visual C++ 中的中止错误

WebJob 运行失败,原因是:System.Threading.ThreadAbortException:线程被中止

C#线程中止

AppDomain.Unload() 如何中止线程?