问题标签 [thread-abort]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
34089 浏览

asp.net - 当调用 ASP.NET System.Web.HttpResponse.End() 时,当前线程被中止?

当 System.Web.HttpResponse.End() 被称为 System.Thread.Abort 被触发时,我猜这是(或触发)异常?我有一些日志记录,这已列在日志文件中...

第一次机会

这是正常行为吗,是否可以优雅地中止而不是(看起来像)突然中止?

更新

到目前为止,这是设计使然的普查。所以我想知道我们是否有可能提出这个问题,看看我们是否可以调整代码以使其不会感觉我们过早地结束线程并优雅地退出......可能吗?代码示例?

0 投票
1 回答
12790 浏览

vb.net - SqlClient 调用导致“线程在 SNINativeMethodWrapper.SNIPacketGetConnection(IntPtr 数据包)处被中止”

我真的很感激任何建议,无论多么简单或复杂,以帮助我隔离和解决这个问题。

我有一些生成小报告文件的代码。对于集合中的每个文件,执行存储过程以通过 XML 阅读器获取数据(它是一个非常大的结果集)。当我创造了这一切并逐步完成它时,一切都很好。文件生成,没有错误。

该库通过远程调用,并通过 IIS 托管。当我部署编译库并调用它时,它能够生成一些报告,但随后会引发线程中止异常。如果我将调试器附加到 asp 工作进程,并逐步执行代码,我就没有问题。

看到这个失败是相当一致的,我寻找相似之处,发现失败发生在不同的报告上,但似乎发生在大约相同的时间点。

这让我认为这是调试器覆盖的超时设置,我对整个过程进行了一些粗略的计时(不是单个失败的代码),它似乎在大约 200 秒后就失败了。web.config executionTimeout 设置为 600 分钟(足够高)。此服务器应用程序的其他部分需要 COM+ 事务(2 分钟超时),但这不是其中之一。我不知道它可能会达到什么超时(大约 200 秒大关)。

SQL 连接超时默认保留(连接打开成功),命令超时为 300 秒(执行命令仅需 12-15 秒)。

  • 还有其他我可能会错过的超时吗?

我运行了 SQL 探查器,它显示正确返回了结果(所有语句和 RPC 都已完成 - 没有错误)。通过 SSMS 执行代码提供了完美的结果。

使用反射器,我深入研究了 SNINativeMethodWrapper,它是非托管代码的包装器,但我看不出它实际上在做什么。我只能假设(可能是错误的)代码已经从 SQL 服务器接收到 TDS,并且包装器正在尝试获取与数据包关联的连接,但它不能。

  • 有谁知道这个包装器应该做什么?
  • 有没有办法跟踪/调试此代码以找出导致失败的原因?

我尝试使用不同的方法(ExecScalar、DataAdapter),但它们都在内部使用 ExecuteReader。

我尝试禁用连接池并强制客户端使用与服务器相同的数据包大小。

  • 是否有人对导致此问题的原因有任何想法,或者我可以做些什么来隔离并尝试纠正问题?

这是生成异常的调用代码。

0 投票
8 回答
10797 浏览

c# - 如何抑制 thread.abort() 错误 C#?

我在加载程序时在后台线程上显示启动画面。加载后,我将中止线程,因为它的唯一目的是显示正在加载启动画面。

我的问题是,当中止一个线程时,它会抛出一个ThreadAbortException用户只需单击继续即可。

我该如何处理?我试图像这样压制它-->

但我有一种感觉,这会让我在这里大喊大叫,但它没有任何作用。

谢谢!

0 投票
1 回答
174 浏览

c# - 无响应线程的问题

我有一个 Web 应用程序,它在按钮上运行多个线程,单击每个线程在不同的 ipAddresses 上进行 IO 调用,即(登录 Windows 帐户,然后进行文件操作)。阈值为 30 秒。我假设如果超过阈值登录尝试,ipAddress 上的设备与我的条件不匹配,因此我不在乎。Thread.Abort() 不适合我等待 IO 调用完成的情况,这可能需要很长时间。

我尝试在阈值超时后立即根据线程状态进行数据库操作。它工作得很好,但是当我检查日志文件时,我注意到无响应线程的 thread.IsAlive 属性仍然是 true。在我的本地电脑上进行了几次调试后,我遇到了一个可能的死锁情况(我怀疑)我的电脑严重崩溃了。

简而言之,您对在执行 button_click 后立即杀死(强制)无响应线程(等待 IO 操作)有任何想法吗?

(PS:我没有使用线程池)

乌古占

编辑

为了进一步澄清,

我需要在每个 ipAddress 上验证给定的本地管理员凭据,并为后续的插入数据库记录。其余的,我不在乎。

在我的验证方法中,我首先调用了win32的logonuser方法,通过导入advapi32.dll来模拟管理员用户。之后,我尝试通过 Directory.CreateDirectory 方法在远程系统驱动器上创建一个临时目录,以检查授权。如果抛出了任何异常(UnauthorizedAccessException 或 IOException),那么远程机器就不感兴趣了,否则我们得到它,所以将它插入 DB。

我将验证方法称为给定 IP 范围的同步方式,它对一堆连续的端点工作得很好。但是当我针对一些不相关的 ipAddress 范围测试该方法时,每次验证尝试都需要 20 秒到 5 分钟才能完成。

然后我将我的设计转变为多线程方式,我决定在单独的线程中运行每个验证,并在阈值数量结束时中止无响应的线程。问题是 thread.abort 不太适合这种情况,它实际上等待 IO 指令的返回(我不想这样做)并在此之后引发 ThreadAbortException。

为了完成连续线程的执行,我忽略了无响应的线程并继续进行数据库操作并从按钮单击方法返回(此时无响应的线程仍然存在)。在执行按钮单击(在调试模式下)几次后出现严重的系统崩溃之前,一切似乎都很好。问题可能是 IIS 服务下的活动线程数量不断增加。

解决方案

线程没有及时响应的原因是找不到网络路径的情况。我的解决方案是在进行 IO 调用之前检查端口 135 上的 TCP 连接(Windows 上的 RPC 必须使用端口 135)。默认超时时间为 20 秒。如果您需要设置 timout,请使用 BeginConenct。另一个选项是 Pinging(如果在网络中启用了 ICMP)

0 投票
1 回答
289 浏览

.net - 在 .NET 中中止线程时,这段代码会损坏吗?

小介绍:

在复杂的多线程应用程序(企业服务总线 ESB)中,我需要使用 Thread.Abort,因为这个 ESB 接受用户编写的与硬件安全模块通信的模块。因此,如果此模块死锁或硬件停止响应 - 我只需卸载此模块,此服务器应用程序的其余部分必须继续运行。

所以有中止同步机制确保代码只能在用户部分中止,并且该部分必须标记为 AbortAble。如果发生这种情况(中止),则有可能在这段代码中抛出 ThreadAbortException:

例如模块在 AbortSection(通过调用类似方法 StartAbortSection 进入),ServerAplication 决定中止用户模块,但在此决定之后但在实际 Thread.Abort 之前,模块通过调用此方法进入 NonAbortableSection,但实际上对该锁定对象进行了锁定.

所以 lock 将阻塞直到 Abort 被执行,但是 abort 也可以在到达这段代码中的这个块之前被执行。但是使用这种方法的对象是必不可少的,我需要确保这段代码在任何时候都可以安全中止(不会被破坏 - 例如,我不知道从字典中读取时会发生什么......)。

所以不得不提一下threadIdMap是Dictionary(int,ManualResetEvent),而锁定对象是ManualResetEvent的实例。

我希望你现在能理解我的问题。对不起它的大。

0 投票
1 回答
680 浏览

java - 处理 servlet 中的请求意外结束

我目前正在使用 Jersey/Tomcat 开发 REST Web 服务(但欢迎使用通用 Servlet/Container 答案)。如果客户端对从 MySQL 连接返回大量数据的服务执行一些 GET 请求。

为了避免任何 OOM 异常,我对 MySQL 使用流模式。

但是,如果客户端在加载期间中止请求,则 MySQL 连接不会关闭。之后,服务器将不再处理任何其他请求,因为一次只能处理一个“流”请求。

所以问题是:每当请求在我的服务器上结束时(正常或异常),我怎样才能得到通知。我可以注册某种听众吗?还是使用 UncaughtExceptionHandler ?

我已经看到了很多关于在 Jersey 中处理异常以将它们转换为“响应”的事情,但没有任何事情可以处理请求的过早结束。我猜 Jersey 或 Tomcat 可能会在没有通知的情况下简单地破坏我的线程。我可以在我的方法的关键部分捕获一些异常以了解何时发生此类线程中断吗?

在此先感谢您的帮助,

拉斐尔

0 投票
3 回答
1613 浏览

c# - 由于 AcceptSocket,Thread.Abort 似乎没有抛出 ThreadAbortException

我正在调用ChannelServer.ListeningThread.Abort以下线程,但似乎没有任何反应。我想更具体一些,但我想不出更多。似乎没有ThreadAbortException抛出,并且无论阻塞侦听器如何都应该抛出这个异常(它在阻塞接收的线程上完美运行)。

重要编辑:使用 aManualResetEvent.WaitOne而不是AcceptSocket,正如 Lyrik 建议用于测试的那样,它可以完美运行。怎么会AcceptSocketThreadAbortException

链接:这个论坛帖子似乎讨论了同样的问题,虽然我无法弄清楚它:http ://www.tek-tips.com/viewthread.cfm?qid=319436&page=413

0 投票
4 回答
3803 浏览

c# - 如何中止多个线程?

在此代码中,当button1单击两次时,它会创建 2 个单独的线程。单击一次,它会在堆上创建一个新线程,并且字段t1指向堆上的新线程。当我单击button2时,它会中止最后一个线程(t1指)。

如何中止另一个线程?

0 投票
2 回答
5502 浏览

c# - 如何唤醒 C# 中的睡眠线程?

在人们建议之前: 除了试图找到一种解决方法之外,我没有将 Thread.sleep 用于任何事情。我正在尝试处理其他人的未来代码,这些代码可能不是 .Sleep() 免费的。我非常清楚同步事物的可怕程度。

我在我的代码块中接受一个线程。我希望能够为这个线程的生命周期设置一个限制。我通常这样做的方法是这样的:

从那以后,我发现在睡眠结束之前我显然无法唤醒睡眠线程。更糟糕的是,如果我给它 10 毫秒的生命周期,它仍然会写入控制台:

虽然我意识到 .Abort() 不是线程执行的硬限制。似乎 2 秒就足够了一个警告,但我想不是......

我试过检查 WaitSleepJoin 状态和 .Interrupt(); 它使线程崩溃,或引发异常(抱歉,不确定是哪个。Windows 告诉我,如果没有调试器正在运行,它就会崩溃,如果它正在运行,它就像没有调用中断一样运行),并且仍然在 2 秒后写入控制台. .Resume() 显然对睡眠线程没有任何作用。

没有办法唤醒一个线程,而不等待它的睡眠到期?我知道停止不是“立即的”,因此无论如何都可以调用 Console.WriteLine;这是困扰我的 2 秒等待。如果等了10天呢?由于无法控制进来的线程,我无从得知,而且似乎也没有办法阻止这种事情发生……

0 投票
2 回答
3056 浏览

c# - .NET 线程:如何在未启动的线程上捕获中止?

编辑:这似乎是一个症结所在,所以我将把它排除在外:

我没有使用它进行同步。只是在不再需要/可取时终止长时间运行的任务。
假设:假设这些线程只是简单地写入控制台(比如:“线程 1”),休眠一个随机长度,然后退出。如果他们被中止,我希望他们通过另一个控制台写入通知我(比如:“线程 1 中止”)。如果我在运行之前尝试中止它,我希望能够直接跳转到中止代码,而没有任何机会执行其正常功能。如果它在正常运行期间中止,它当然会同时打印两者。


我有一大堆线程我希望在一个运行 .NET 2.0 和 Visual Studio 2008 的 ASP 站点上按顺序运行(不知道这有多重要,但它就在那里),它们可能已经中止清理代码无论他们的任务有多远,都应该运行它。所以我做了一个这样的线程:

现在,如果我希望在中途中止线程集,那么以后可能仍然需要进行清理。查看 MSDN 意味着您可以 .Abort() 一个尚未启动的线程,然后 .Start() 它,此时它将接收异常并正常执行。或者您可以 .Join() 中止的线程等待它完成中止。大概你可以将它们结合起来。

http://msdn.microsoft.com/en-us/library/ty8d3wta(v=VS.80).aspx
要等到线程中止,您可以在调用 Abort 方法后在线程上调用 Join 方法,但是不能保证等待会结束。
如果在尚未启动的线程上调用 Abort,则调用 Start 时线程将中止。如果在阻塞或休眠的线程上调用 Abort,则该线程将被中断然后中止。

现在,当我调试并逐步执行此代码时:

在任何时候我都看不到任何输出,也没有到达 try 或 catch 块上的任何断点。
奇怪的是,ThreadStartException 没有被列为 .Start() 的可能抛出,从这里:http: //msdn.microsoft.com/en-us/library/a9fyxz7d (v=VS.80).aspx (或任何其他版本)

我知道这可以通过使用 start 参数来避免,该参数说明线程是否应该跳转到清理代码,并在 Abort 调用之前(这可能是我要做的)。我可以.Start() 线程,然后 .Abort() 它。但是由于 .Start 和 .Abort 之间的时间不确定,我认为它不可靠,并且文档似乎说我的原始方法应该有效。

我错过了什么吗?文档有错吗?

编辑:哦。而且你不能在非参数化的线程(开始)上调用 .Start(参数)。除了反复试验,有没有办法找出线程是否被参数化?我看到了一个私人 m_Delegate,但没有公开...