【问题标题】:Exception: Thread was being aborted when not dealing with a Response.End issue例外:不处理 Response.End 问题时,线程被中止
【发布时间】:2017-01-27 17:37:14
【问题描述】:

我有一个 Web 应用程序,其中有一个页面,我每 30 分钟调用一次以激活工作人员。每周大约 5-7 次,我收到 Thread was being aborted 异常

aspx 看起来有点像:

<%@ Page Language="C#" AutoEventWireup="true" %>
<html>
<head runat="server">
    <script runat="server"> 
    public void Page_Load(object sender, EventArgs e)
    {
        System.Threading.Tasks.Task.Factory         
            .StartNew(() => { new MyApplicationWorker().RunApplicationWorker(); });
    }   
    </script>
</head>
<body></body>
</html>

在 Web.config 中,我有这行来防止超时,我知道工作人员在比这更短的时间内完成。

<httpRuntime enableVersionHeader="false" executionTimeout="300" />

如您所见,页面加载并调用在后台运行的工作人员。没有 Response.End 问题或 Server.Transfer 这是大多数其他处理此问题的帖子所围绕的。我能做些什么来防止异常发生?

【问题讨论】:

  • 什么是 IIS 池回收设置?也许整个应用程序正在被回收?
  • 也许这可能与stackoverflow.com/questions/7558145/… 相关?其中一个答案引用了 MSDN:Background threads are not waited-on before application terminating,也许 IIS 只是回收了杀死线程的进程。
  • @PawełŁukasik:该应用程序(目前)托管在共享托管环境中。

标签: c# asp.net


【解决方案1】:

所以这是我一年多来一直在寻找解决的错误,所有其他相关问题似乎都解决了 Response.End() 问题,但事实并非如此。

我一直认为发生错误的方法有问题,但实际上是调用工作人员的地方导致错误开始。

解决方案很简单:我添加了.Wait(),此后该错误就从日志中消失了。

System.Threading.Tasks.Task.Factory         
      .StartNew(() => { 
          new MyApplicationWorker().RunApplicationWorker().Wait(); 
      });

感谢 alex.b 的评论导致了这个 other question,我希望这可以帮助其他遇到同样问题的工作线程被中止的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-26
    • 1970-01-01
    • 2016-04-23
    • 1970-01-01
    • 2014-01-06
    相关资源
    最近更新 更多