问题标签 [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.
c# - 从同一个线程内部中止线程
我创建了一个线程 A 并决定从线程 A 内部中止它。这可能吗?如果是这样,我该怎么做?
谢谢您的帮助!
c# - 通过名称中止线程
我想知道是否可以使用线程名称中止(肮脏的方式)线程?这是一些示例代码:
所以现在我创建了一个线程。稍后在程序中,用户可能会结束一个线程,这就是我的问题所在。如何通过它的名称结束一个线程?或者也许是另一种结束它的方式?我不想使用后台工作者。
例子:myThead[4].Abort();
谢谢
android - 如何取消 n 秒 Thread.sleep 以便在 android 中重新启动它?
我正在尝试制作一个游戏,其中包含一个带有 10 秒 Thread.sleep 的线程,它为玩家提供了最大的反应时间(当睡眠结束并且他/她没有选择任何东西时,会出现新的东西这是一个失去的生命)。但是,如果玩家点击了一个选项(无论它是否正确),新的东西应该立即出现,并且应该“取消”睡眠以重新开始这 10 秒。换句话说,现在如果一开始我有 10 秒,但在三秒后我点击了一个选项,那么在我的界面更改之前我还有 7 秒的时间,当它应该是另外 10 秒时......我知道我不能打破那个睡觉,但我怎么能做到这一点?我没有发布任何代码行,因为我想先了解这个概念,然后我才能弄清楚。
c# - 这是调用 Thread.Abort() 的合适位置吗?
我有一些从 Steve Marx 那里借来的代码。主块在 azure worker 角色线程中用于获取 azure blob 的租约。当您只希望一个实例一次处理一个作业时,这提供了一种锁定机制,用于在多个工作实例之间进行同步。但是,由于您的作业可能需要比 blob 租约超时时间更长的时间才能完成,因此会产生一个新线程来每隔一段时间更新 blob 租约。
此更新线程在无限循环中休眠和更新。当主线程退出时(通过Dispose
类的消费者),renewalThread.Abort()
被调用。ThreadAbortException
这导致在worker角色中抛出各种s。
我想知道,这是处理这个问题的更好方法吗?我不喜欢的是,在产生它们的消费者被处理后,你可以有几个保持休眠状态的更新线程。下面的代码有什么不好的地方吗?如果是这样,有没有更好的方法?还是Thread.Abort()
这里合适?
更新
假设您有一个部署了 2 个或更多实例的 azure worker 角色。还假设您有一份工作,两个实例都有能力为您处理。在工作角色Run
方法中,您可能会遇到以下情况:
每一秒,该角色都会检查某些作业是否计划运行,如果是,则处理它们。但是,为了避免让两个角色实例处理相同的作业,您首先要对 blob 进行租约。通过这样做,另一个实例无法访问该 blob,因此它被有效地阻止,直到第一个实例完成处理。(注意:在上面的 .Perform 方法中发生新的租约。)
现在,假设一项工作可能需要 1 到 100 秒才能完成。Blob 租约有一个内置的超时,因此如果您想在进程完成之前阻止其他角色,您必须定期更新该租约,以使其保持超时。这就是上面的类所封装的——自动更新租约,直到您将其作为消费者处理。
我的问题主要是关于renewThread中的睡眠超时。说工作在 2 秒内完成。更新线程将优雅地退出(我认为),但不会再过 38 秒。这就是我的问题的不确定性所在。原始代码调用了renewThread.Abort(),导致它立即停止。这样做更好,还是让它休眠并在以后优雅地退出?如果您Run
每秒一次对角色的方法进行心跳检测,则最多可能有 40 个此类更新线程等待正常退出。如果您有不同的作业阻塞在不同的 blob 上,则该数字将乘以租用的 blob 数。但是,如果您使用 Thread.Abort() 执行此操作,您会在堆栈上得到同样多的 ThreadAbortExceptions。
c# - cpu+时间密集型方法的 Thread.Abort 替代方案
我有一个关于多线程应用程序的问题。我使用 TaskFactory 来启动 cpu+time 密集型方法。此方法是对 SAP 的调用,需要很长时间才能完成。用户应该可以选择取消任务。目前我正在使用 thread.Abort(),但我知道这种方法不是取消它的最佳解决方案。有没有人推荐替代品?
代码示例:
c# - 在设定的时间量和/或中止线程问题后调用方法
所以我有一个使用 filesystemWatcher 并很好地触发事件的应用程序。FSW 将触发一堆非常接近的时间。我想创建一个在上次触发 FSW 后一小时触发的函数。
我首先尝试使用后台工作人员:(为清楚起见,所有代码都被缩短了)
这不起作用,因为第二次bw.RunWorkerAsync()
调用它显然很忙,即使调用bw.CancelAsync()
.
我的下一次尝试涉及一个常规线程,因为我在 SO(现在找不到链接)的某个地方读到了一个无法像我尝试做的那样“重新启动”backgroundWorker 的内容。
线程尝试几乎相同,但我想我会尝试,因为 backgroundWorker 中可能存在一些常规线程中不存在的约束。我想。
但这给了我同样的错误。在第二个电话PWC_counter_thread.Start()
是忙。
我假设在第二个线程等待时不存在竞争条件,在本例中为 3 分钟,并且初始 FSW 方法需要整整一秒才能执行,因此我相信对 .Abort() 的调用和.CancelAsync() 都在各自的方法完成之前完成。
现在的问题:
是否可以以我尝试的方式重新启动线程?如果是这样,我做错了什么?
我应该以另一种方式延迟我的方法调用吗?如果是这样,提示?
编辑/更新/解决方案
我从来没有像我想要的那样启动和停止线程工作,所以我找到了另一种解决我的情况的方法。
情况是我有第二个线程作为一种计时器,它会在设定的时间后调用一个方法。我的第一个线程做了一些工作,完成后它将启动第二个线程。如果第一个线程在计时器线程完成之前再次启动,它应该杀死线程并重新启动它。对我来说,这证明很难达到我想要的方式。所以我改为采用另一种方法来实现我想要的最终结果。我没有重新启动线程,而是简单地重新启动了我的第二个线程用作计数器的秒表。这给了我想要的结果。这可能是不好的做法,但它有效。
c# - Microsoft ReportViewer ThreadAbortException on Export cancel
我有一个带有微软报表查看器的窗体程序。当我生成报告并选择Export to Excel
(带有软盘和绿色箭头的小图标)时,它开始导出。但是,如果我Cancel
在生成 excel 文件时按,我会得到一个错误:An Error occured during local report processing. System.Threading.ThreadAbortException: Thread was being aborted.
.
我该如何处理这个错误?如果我设置报告查看器错误处理程序(this.reportViewer.ReportError += new ReportErrorEventHandler(reportViewer_ReptError);
)我可以处理其他错误,但不能处理这个(断点永远不会命中)。
c# - 如果花费的时间太长,请停止线程
我是 Windows Phone 开发的新手,我正在尝试使用 C# 创建一个 Windows Phone 应用程序
我无法更改 doaheavywork 功能。
我只需要在 1 或 2 秒内计算结果,因为有时它可能会运行很长时间。
我读过使用 abort 是错误的方法。
我在 PhotoChooserTask 完整功能中使用上述内容。第一次运行执行良好。也就是说,当我点击按钮选择一张照片时,doaheavywork函数不超过1秒。但如果我第二次尝试,PhotoChooserTask 只会抛出异常并停止。
是因为我在第一次运行中中止了该过程吗?还是别的什么?还有其他方法吗?
multithreading - 如果线程挂起或花费太多时间来完成执行,则取消分配线程资源
我正在创建一组线程来访问 Web 服务并返回值。如果 threading.timer 中的超时计时器超过,我已将 threading.timer 添加到每个线程并尝试释放线程使用的资源。
这里我是怎么做到的。
所以为了检查它是如何工作的,我让 webservcieclient 超过了超时时间。然后计时器触发并中止线程。
但后来我看到的是 webservcieclient 有时在网络/http 异常之后返回,它已经执行并抛出另一个异常,说线程被中止。另外 UpdateDB() 已经运行了两次。它是如何运行的,因为线程已经中止。是因为在访问 Web 服务方法时启动了另一个线程吗?
multithreading - 如何在 C# 中释放非响应线程
我已经实现了一个应用程序,它正在创建新线程并对其执行操作。我一直在想,如果某个线程如何挂起或无响应,那么如何释放该线程使用的分配内存和其他资源。
请注意,在我的申请中,我已经解决了以下问题。所以我想要一些更具体的专家级答案来杀死或释放线程。
在阅读了几篇专家的文章并实施了一些解决方案后,我了解到 Thread.abort() 在大多数情况下不应该使用。只有在我们知道当前正在使用的位置和状态或类型的资源时才应该使用它由那个线程。对我来说,这看起来像是一个无法存档的目标。
因为我们永远不知道线程实际挂在什么/哪里。无论是在移动时获得锁定还是正在读取/写入文件。
因此,如果我们在任何这些情况下终止/中止线程,它可能会使情况变得更糟。因此,非其他线程将能够获取该线程已使用的任何资源,并且应用程序将停止工作或崩溃。
看到很多人想出了自己的解决方案,这真是令人惊讶——尽管有很多危险因素需要同时进行。
我相信我们不能使用 thread.abort() (由于上述原因)。我们可以做的是防止或减少制作无响应线程的机会,
在实现上述内容之后,如果我们得到一个挂起的线程,那么只能采取以下行动。
请让我知道您在这方面的意见。非常感谢。