【问题标题】:Thread abort (Timeout) in ASHX handlerASHX 处理程序中的线程中止(超时)
【发布时间】:2014-01-06 16:03:47
【问题描述】:

背景

我有一个批处理系统,需要向一群人发送消息(通过 SMS/电子邮件)。

由于我们的消息发布系统相当慢,当用户点击“发送”按钮时,系统会将所有消息信息发布到具有“批处理 ID”的数据库中,然后执行异步调用 (WebRequest.BeginGetRequest) 到一个“ProcesBatch”ASHX 处理程序请求,批处理 ID 作为 URL 请求参数。

这会将前端页面释放给用户以进行下一批消息,因为用户实际上不需要任何反馈,但是,数据库中的记录随后用于报告模块。

同时,批处理处理程序简单地围绕给定批处理 ID 的数据库中的记录循环,然后按顺序将消息发布到我们的(慢)消息发布者。

问题

问题是在批处理过程中,asp.net 抛出了一个

System.Threading.ThreadAbortException: Thread was being aborted.

进行到一半,剩余的消息没有发送。

我检查了 IIS,并且回收分钟设置为默认 1740,那么还有什么会导致这种情况的吗?

或者有没有更合适的方法来解决这个问题。

【问题讨论】:

  • 您可以使用 Windows 服务,而不是在您的网络服务器上运行的异步函数
  • 这是我考虑过的事情,如果它只是那些无法控制的 IIS/ASP.Net 事情之一,那么它就是我的“支持”选项。
  • Response.Redirect 将抛出 ThreadAbortException,正如我提到的 in this SO answer,这取决于你如何使用它。也许看看做Response.Redirect(url, false); 是否有帮助。但就像@RononDex 所说,windows 服务会更适合这个。
  • @MikeSmithDev - 我实际上并没有做任何重定向。主用户页面对 ASHX 处理程序执行异步“WebRequest.BeginGetResponse”。然后 ASHX 处理程序(偶尔)让线程中止。

标签: asp.net multithreading iis batch-processing


【解决方案1】:

你有没有试过在web.config中的httpRuntime下增加executionTimeout?
默认值为 90 或 110 秒(取决于 .net 版本)。
也许你的 ashx 需要更多时间来结束它的工作
http://msdn.microsoft.com/en-us/library/vstudio/e1f13641(v=vs.100).aspx

编辑:一般来说,设置很长的执行超时不是一个好主意。正如其他用户建议的那样,考虑开发一个 Windows 服务来完成长期工作。

【讨论】:

  • 感谢 Fabrizio,查看链接肯定会阐明为什么我在 Visual Studio 中以调试模式运行时没有问题,因为 executionTimeout 设置仅在发布模式下生效,并且在我的 ACC 上我遇到问题的服务器。
  • 克里斯,如果您在 web.config 下设置
  • 如果可以的话,请分享源代码和完整的异常(和内部异常)。
  • Fabrizio... 我已经进行了一些测试,确实是exectionTimeout 值。没有将其设置为一个不可行的大数字,我认为“服务”路线将是前进的方向。
猜你喜欢
  • 1970-01-01
  • 2013-03-30
  • 2013-03-16
  • 2011-09-19
  • 1970-01-01
  • 2012-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多