问题标签 [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 投票
2 回答
244 浏览

c# - 从另一个线程开始新的 theard 并中止它 C#

如果我这样做:

我中止运行 DoWork 的第一个线程是 DoMoreWork 也会中止吗?如果不是,我如何中止 sec 线程(DoMoreWork)?

谢谢!

更新:

我运行脚本的问题,Microsoft.Scripting为此我启动了一个调用Execute()方法的新线程,Microsot.Scripting我希望能够中止脚本。我可以中止我的线程,但我不知道哪个线程 Execute 创建来运行脚本。

0 投票
1 回答
997 浏览

c# - 一旦调用停止,阻止线程进一步处理

我有一个 Windows 服务,它将启动和停止某些进程的执行,这些进程正在使用持有的线程完成。

我有两个类如下:

_actionQueue 是一个自定义源代码,用于在指定的重复时间间隔执行指定的操作。所有动作都保留在队列中,并在指定的时间间隔内调用。

现在,Windows 服务的 OnStart 和 OnStop 方法将分别调用 Engine 类的 Start 和 Stop 方法。

我想要的是当 Windows 服务停止时,所有正在运行的线程都应该停止它们的处理/执行。

但是,这里发生的事情是在创建新线程实例时,我有一个 Windows 服务,该服务将启动和停止某些进程的执行,该进程正在使用持有的线程完成。

我有两个类如下:

ActionQueue 是一个自定义的源代码,用于在指定的重复时间间隔执行指定的操作。所有动作都保留在队列中,并在指定的时间间隔内调用。

现在,Windows 服务的 OnStart 和 OnStop 方法将分别调用 Engine 类的 Start 和 Stop 方法。

我想要的是当 Windows 服务停止时,所有正在运行的线程都应该停止它们的处理/执行。

但是,这里发生的是在 StartTask 方法中创建新线程实例时,当我调用 _task.ForEach(task => task.Abort()) 我没有正确的 Thread 实例,这就是所有实例_thread = new Thread(....); 没有被访问,因为同一个 PerformTask 类会有多个队列。

注意:我无法更改 ActionQueue。

  1. Abort 方法是停止线程的正确方法吗?

  2. 如何停止所有线程(包括源代码创建的 Thread 类的所有实例)?

0 投票
2 回答
126 浏览

winforms - 中止这个文件搜索线程是否安全?

首先,代码:

我正在构建一个小的图像查看程序。打开图像时,它会列出同一目录中的文件数。我注意到,当我在包含许多其他文件(比如 150K)的目录中打开图像时,构建文件列表需要几秒钟。因此,我将此任务委托给另一个线程。

但是,如果您在完成搜索文件之前打开另一个图像,则旧计数不再相关,因此我将中止线程。

我正在锁定_dirFiles_fileIndex因为我想添加一些关键功能LeftRight在照片之间切换,所以我必须在其他地方访问那些(但在 UI 线程中)。

这安全吗?现在 C# 中处理线程的方法似乎有几十种,我只是想要一些简单的方法。


fileName是一个局部变量(这意味着它将被“复制”到匿名函数中,对吗?),并且_searchOption是只读的,所以我想这两个是可以安全访问的。

0 投票
4 回答
1640 浏览

c# - 为什么我的线程没有停止?

我有以下代码,我开始Thread使用ParameterizedThreadStart对象作为构造函数参数:

在我在方法中设置之后obj,参数仍然是一个有效的对象,为什么? 如何将参数设置为using ?nullThreadTesto
onullobj

我宁愿不使用 Thread.Abort

0 投票
1 回答
155 浏览

.net - 窗体关闭时可以调用 thread.Abort() 吗?如果不是,那么全球标志是否足够好?

首先, Thread.Abort() 是邪恶的——明白了!现在让我解释一下我的情况...

情况:

我有一个只向用户显示当前运行状态的仪表板。它针对 Sql Server DB 执行各种选择查询,并执行一些最终在仪表板上显示给用户的计算。用户可以同时打开多个仪表板。我有一个计时器线程,每隔几秒钟刷新一次仪表板。该计时器线程产生另一个线程(实际上队列在线程池上工作)以执行长时间运行的计算/查询。

问题:

当用户点击 X 关闭 Dashboard 窗口时,它需要立即关闭(比如说在一秒钟内,我认为 2 秒太长了)。所以我使用这段代码:

问题是有时会捕获 ThreadAbortException,有时则不会。我发现在执行查询的过程中它几乎没有被捕获。

[更新]我最近发现如果我检查内部异常,我可以捕获 ThreadAbortException。

问题:

  1. 在这种情况下可以使用 Thread.Abort() 吗?如果是这样,我如何始终捕获 ThreadAbortException 以便用户在关闭表单时看不到它?(根据我的阅读,我认为这是不可能的)
  2. 如果不能使用 Thread.Abort() (这是我认为你们大多数人会回答的),那么这是我对使用“全局布尔标志”来告诉线程何时关闭的其他担忧。
    • 我担心线程不会在 1 秒的时间限制内停止。(例如,我可能有一些查询需要 1-2 秒才能运行)
    • 我将不得不用 if(shouldShutdown) 语句来弄乱我的代码。
    • 我应该将 shouldShutdown 标志设为静态,以便我的所有课程都可以使用它吗?如果用户可以同时打开多个仪表板,这会带来问题吗?(我担心在所有仪表板之间共享静态变量。这是我绝对不想要的。)
    • 当工作线程看到他们必须关闭时,他们应该抛出异常还是直接返回?如果它们只是返回,那么我将不得不添加更多 if(shouldShutdown) 检查,因为某些函数返回 false 是可以的。如果抛出异常是可以的,你推荐哪个异常?定制的?

谢谢

0 投票
1 回答
162 浏览

php - PHP 线程脚本中止

我在我的服务器(一个线程)上每 1 小时运行一次 php 脚本。这个线程正在做的是,用户可以上传带有数据的excel文件,线程将excel文件中的数据与数据库中的数据进行比较并做一些事情(如果找到的行不存在,则在数据库中插入一些不相关的内容)。要读取 excel 文件,我调用:

用户可以上传更多 xls 文件,在名为:File_1.xls、File_2.xls、File_3.xls 的服务器上我读取第一个文件获取所有数据进行所有比较进行所有插入这可能需要一段时间有时超过 6000 excel中的行。我注意到,如果线程运行时间很长,例如他可以插入文件 1 和文件 2,并且文件是一个大的,比如 6000+ 行,我会在我的错误日志中得到一个 Abort。我认为这是excel读者的错。有任何想法吗?

0 投票
2 回答
1354 浏览

c# - 告诉正在执行循环的线程跳出循环并做其他事情的正确方法是什么?

以下代码的缺点是,在主线程重置等待句柄后,工作线程既不会立即终止,也不会执行最终操作。相反,它将继续做它正在做的事情,直到它到达循环的下一次迭代,此时它将被无限期地阻塞。

下面的代码的缺点是它使用了 Abort() 方法(有人说应该不惜一切代价避免它),但完全符合我的要求:强制工作线程退出循环一旦主线程告诉它这样做,执行最终操作并退出。

由于这两种解决方案都不是理想的,所以实现我正在寻找的功能的正确方法是什么?

(我更喜欢不涉及 .net 4.5 任务的解决方案)

0 投票
1 回答
2994 浏览

c# - Thread.Abort() 与 Application.Exitthread()

我知道 Exitthread 只能从 Thread 内部调用,而 Abort 可以随时随地使用,只要您可以访问 Thread 对象。但是当您需要强制关闭线程时,这两种方法(操作方面)之间是否存在其他显着差异?

0 投票
1 回答
440 浏览

java - 如何在不终止执行此操作的线程的情况下取消文件上传/下载操作?

我的代码调用从 Internet 下载文件的 API 方法。因为下载可能需要很长时间,我想为用户提供取消下载的能力,如果他们在后台线程处理文件下载时关闭显示进度条的窗口。

我不确定我对 API 方法调用的代码有任何控制权,所以我假设我没有选项来指示此代码需要取消下载操作。

如果这个假设是正确的,我如何根据用户请求终止文件下载操作,而不必中止/中断或以其他方式终止执行实际文件下载的后台线程?

0 投票
5 回答
2288 浏览

c# - Thread.Abort() 是如何工作的?

当无效输入传递给方法或对象即将进入无效状态时,我们通常会抛出异常。让我们考虑以下示例

在上面的例子中,我插入了一个 throws 语句ArgumentNullException。我的问题是运行时如何设法抛出ThreadAbortException. 显然不可能throw在所有方法中都使用语句,甚至运行时也设法抛出ThreadAbortException我们的自定义方法。

我想知道他们是怎么做到的?我很想知道幕后发生了什么,我打开了一个反射器打开Thread.Abort并结束了这个

然后我用谷歌搜索,发现这个ThreadAbortException 是如何工作的。这个链接说运行时通过QueueUserAPC函数发布 APC,这就是他们如何做到的。我不知道QueueUserAPC我只是尝试看看是否可以使用某些代码的方法。以下代码显示了我的尝试。

如果做错了什么,请原谅我,我不知道该怎么做。再次回到问题,对此或部分 CLR 团队了解的人能否解释它在内部是如何工作的?如果APC技巧运行时遵循这里做错了什么?