【问题标题】:Thread abort while making HTTP Get Request发出 HTTP 获取请求时线程中止
【发布时间】:2015-04-27 20:32:19
【问题描述】:

最近我开始收到带有以下堆栈跟踪的警报:

消息:线程被中止。

堆栈跟踪:在 System.Net.Connection.CompleteStartConnection(Boolean 异步,HttpWebRequest httpWebRequest)在 System.Net.Connection.CompleteStartRequest(布尔 onSubmitThread, HttpWebRequest 请求,TriState 需要重新连接)在 System.Net.Connection.SubmitRequest(HttpWebRequest 请求,布尔值 强制提交)在 System.Net.ServicePoint.SubmitRequest(HttpWebRequest 请求,字符串 connName) 在 System.Net.HttpWebRequest.SubmitRequest(ServicePoint servicePoint) 在 System.Net.HttpWebRequest.GetResponse() 在 删除以保护身份

在我看来,在与远程服务器建立实际连接之前,该线程已中止。真的吗?为什么会出现这种情况——试图缩小问题范围。

我尝试查找有关 System.Net.Connection.CompleteStartConnection 方法的文档,但找不到任何东西。有什么想法吗?

更新:添加调用代码的结构以响应 cmets。

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uri);
request.Method = method; request.ContentType = "application/xml";
request.Headers.Add("Foo", "Bar");
request.Proxy = new System.Net.WebProxy(proxyAddress);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();

更新 2:此警报仅偶尔出现几分钟,然后消失。

更新 3:我尚未提供的一条重要信息 - 我在更新 1 中显示的那段代码正在被计时器上的任务调用。

【问题讨论】:

  • 导致此异常的(相关)代码段是什么样的?
  • @ArxoClay 我想他们想看看实际的代码,而不是你描述它:)
  • 当服务调用结束而异步操作仍在发生时,就会发生类似的事情。请注意以下内容:hanselman.com/blog/HowToRunBackgroundTasksInASPNET.aspx
  • 我会把你发布的代码放在TaskThread 中运行。您的 ASMX 页面在该任务或线程完成之前完成其响应。 IIS 会关闭正在运行您的代码的 AppDomain(包括尚未完成的后台进程),您会收到错误消息。这都是猜测,因为您没有显示您的代码,这就是我没有发布答案的原因。请阅读帖子Moby Disk linked 更详细的内容
  • @ArxoClay 是的,超时只是应用程序池可以重新循环的众多原因之一。

标签: c# .net threadabortexception


【解决方案1】:

我以前处理过这个问题,通常这表明通过您的客户端调用服务的代码或服务本身正在调用Thread.Abort()(这是一种不好的做法,但用于缓解这一事实连接可以在服务器上保持打开状态)。服务调用中的ThreadAbortExceptions 主要发生在线程被明确告知中止时。

我应该补充一点,如果服务器正在中止线程,您通常会将其作为SoapException 取回。因此,请检查您的代码库以了解 Thread.Abort() 的用法。

【讨论】:

  • 他正在使用 ASP.NET,它在关闭服务时会中止所有线程。
  • @ScottChamberlain 但他没有托管服务?
  • 他是,请参阅this comment 代码正在 IIS ASMX 实例中运行。 IIS 是调用 Abort 的那个。
【解决方案2】:

非常感谢@Moby Disk 和@Scott Chamberlain 帮助我解决了这个问题。

这个问题是因为托管我编写的代码的应用程序池有一个回收设置,常规时间间隔(分钟)设置为1740 分钟,相当于 29 小时(默认值)。

每当工作线程在这样的回收过程中运行时,我都会看到错误(因为它会收到一个它没有处理的 ThreadAbort 异常)。 修复设置解决了问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-19
    • 1970-01-01
    • 1970-01-01
    • 2019-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多