18

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

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

4

6 回答 6

15

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

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

于 2008-08-25T20:41:02.233 回答
10

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

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

有一种普遍的感觉是(Windows)应用程序花费太多时间试图清理应用程序关闭 - 通常涉及分页大量内存,以便可以再次丢弃它(或运行的分页代码释放操作系统无论如何都会处理的未管理对象)。

于 2008-08-28T18:10:40.790 回答
3

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

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

于 2008-08-25T20:44:37.513 回答
2

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

于 2008-08-25T20:38:49.523 回答
0

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

bool stop = false;
void doDownloadWork(object s) 
{
   if (!stop)
   {
       DownloadLink((String)s, location);
   }
}

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

于 2009-05-22T05:37:34.203 回答
0

根据 Lukas Šalkauskas 的回答。

但你应该使用:

volatile bool stop = false;

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

于 2009-06-10T14:30:01.890 回答