如何中止使用 ThreadPool.QueueUserWorkItem 创建的线程

Posted

技术标签:

【中文标题】如何中止使用 ThreadPool.QueueUserWorkItem 创建的线程【英文标题】:How to abort threads created with ThreadPool.QueueUserWorkItem 【发布时间】:2010-09-06 19:26:09 【问题描述】:

有没有办法中止使用 QueueUserWorkItem 创建的线程?

或者也许我不需要?如果主应用程序退出会发生什么?从它创建的所有线程是否都会自动中止?

【问题讨论】:

【参考方案1】:

您不需要中止它们。当您的应用程序退出时,.NET 将终止 IsBackground = true 的所有线程。 .NET 线程池的所有线程都设置为 IsBackground = true,因此您不必担心。

现在,如果您通过更新 Thread 类来创建线程,那么您需要中止它们或将它们的 IsBackground 属性设置为 true。

【讨论】:

【参考方案2】:

但是,如果您使用的是非托管 这些线程中的资源,您可以 最终会遇到很多麻烦。

这将取决于您如何使用它们 - 如果这些非托管资源被正确包装,那么它们将由它们的包装终结处理来处理,而不管用于终止引用它们的线程的机制如何。 当应用退出时,操作系统会释放非托管资源。

人们普遍认为 (Windows) 应用程序花费太多时间来尝试清理应用程序关闭 - 通常涉及分页大量内存,以便可以再次丢弃它(或分页代码它围绕释放操作系统将处理的未管理对象运行)。

【讨论】:

【参考方案3】:

线程池使用后台线程。因此,当应用程序退出时,它们都会自动关闭。

如果你想自己中止一个线程,你必须自己管理线程(这样你就可以在线程对象上调用 Thread.Abort() )或者你必须设置某种形式的通知机制会让你告诉线程它应该自行中止。

【讨论】:

【参考方案4】:

是的,他们会的。但是,如果您在这些线程中使用非托管资源,您可能会遇到很多麻烦。

【讨论】:

【参考方案5】:

是的,它们是背景,但是 f.ex 如果您有使用 ThreadPool 进行多次下载或其他东西的应用程序,并且您想停止它们,您如何停止?我的建议是: 尽快退出线程,f.ex

bool stop = false;
void doDownloadWork(object s) 

   if (!stop)
   
       DownloadLink((String)s, location);
   

如果你设置 stop = true,第二个(当前在队列中)线程会在队列线程完成处理后自动退出。

【讨论】:

【参考方案6】:

根据 Lukas Šalkauskas 的回答。

但你应该使用:

volatile bool stop = false;

告诉编译器这个变量被多个线程使用。

【讨论】:

volatile 关键字的用途比多个线程使用的变量更具体。使用它时有好时有坏,尽管在这种情况下使用它似乎是合适的,但我只是不希望任何人认为他们应该对所有多线程访问的变量都这样做。这就像说你永远不应该使用事务并且总是在 SQL 中指定 nolock 提示,而该语句在很大程度上取决于手头的解决方案。

以上是关于如何中止使用 ThreadPool.QueueUserWorkItem 创建的线程的主要内容,如果未能解决你的问题,请参考以下文章

Yii2.如何使用 jquery 中止控制器/动作?

如何中止 Rust 进程?

如何使用 node.js/express 中止请求?

如何中止winsock阻塞调用?

如何在使用 ANT 的关键部分构建中止之前删除文件?

如何使用 Swig 中止调用 C 函数的 Python 脚本?