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

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

===============>>#1 票数:15 已采纳

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

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

===============>>#2 票数:10

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

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

人们普遍认为(Windows)应用程序花费太多时间来尝试清理应用程序关闭 - 通常涉及分页 - 大量内存只是为了可以再次丢弃(或者代码中的分页代码)释放操作系统无论如何都要处理的未处理对象。

===============>>#3 票数:3

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

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

===============>>#4 票数:2

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

===============>>#5 票数:0

是的,他们是背景,但是f.ex如果你有应用程序,你使用ThreadPool进行某种多样的下载或东西,你想要阻止它们,你怎么停止? 我的建议是:退出线程asap,f.ex

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

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

===============>>#6 票数:0

根据LukasŠalkauskas的回答。

但你应该使用:

volatile bool stop = false;

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

  ask by juan translate from so

未解决问题?本站智能推荐:

3回复

使用ThreadPool.QueueUserWorkItem进行线程排序

我是线程基础的新手。 我有一个要在XML文件上执行的操作队列(节点添加,节点删除等) 1]有'n'个xml文件,并且对于每个文件,使用ThreadPool.QueueUserWorkItem分配线程池中的线程来执行这些文件操作。 我想使用线程实现并发和操作(重要)的排序。
3回复

使用ThreadPool.QueueUserWorkItem - 线程意外退出

我有以下方法: putFileWorker方法如下所示: 我已经创建了一个小控制台应用程序来测试它。 我为OnPutFileError和OnPutFileCompleted事件连接了事件处理程序。 如果我调用我的PutFile方法,并进入此步骤,它将进入“//如果存储桶不
2回复

停止使用具有特定任务的ThreadPool.QueueUserWorkItem创建的线程

假设我在for循环中将这两个方法排队 有没有办法停止输出Console.WriteLine("Output2");所有线程Console.WriteLine("Output2"); 但保持运行输出Console.WriteLine("Output"); ?
3回复

ThreadPool.QueueUserWorkItem具有任意数量的线程

我有一个ConcurrentQueue ,其中填充有任意数量的对象,并且我想在单独的线程中处理这些对象。 我如何等待所有排队的工作项目完成? 我看过的示例使用固定的ManualResetEvents数组,然后使用WaitHandle.WaitAll使它们全部完成。 我需要管理线程数
1回复

ThreadPool.QueueUserWorkItem对新线程

我有以下代码: 根据Bart De Smet发布的C#4.0教科书(第1466页),使用新线程应该意味着使用的线程比使用我的代码中注释掉的ThreadPool.QueueUserWorkItem要多得多。 但是我已经尝试了两种,并且在资源监视器中看到“新线程”,分配了大约11个线程,但
2回复

ThreadPool.QueueUserWorkItem添加委托吗?

通过阅读一些代码,我发现: 为什么有人要把delegate放在这里?
1回复

foreach内部的ThreadPool.QueueUserWorkItem使用相同的数据集

在下面的函数中,始终将相同的user对象传递给DoRestCall方法 (我确实已经登录了DoRestCall方法,并且它在user对象中具有相同的第一个数据)我是否需要使用Parallel.ForEach而不是Threadpool
2回复

使用ThreadPool.QueueUserWorkitem生成线程时的签名不兼容

错误是: 方法“ Private Sub ProcessToolWork()”不具有与委托“ Delegate Sub WaitCallback(状态为对象)”兼容的签名。 怎么了 我从未遇到过以这种方式生成线程的错误。 这是我的常规定义: 看到有什么问题吗?
2回复

如何将信息从ThreadPool.QueueUserWorkItem传递回UI线程?

我有一个相当简单的线程问题。 我正在编写一个简单的实用程序,它将根据用户定义的参数运行各种SQL脚本。 为了使UI保持响应并提供有关正在执行的脚本状态的反馈,我决定使用ThreadPool.QueueUserWorkItem将适合处理各种脚本的执行(通过SMO)。 但是,对于如
3回复

使用ThreadPool.QueueUserWorkItem和使用System.Thread有什么区别? [重复]

可能重复: 使用Thread.Start与QueueUserWorkItem的优势 如果我想通过线程执行方法,那么我通常会这样使用System.Thread 但是我的同事告诉我,像下面这样使用ThreadPool.QueueUserWorkItem更好 那么性能和