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

时间:2020-03-05 18:43:00  来源:igfitidea点击:

有没有一种方法来中止使用QueueUserWorkItem创建的线程?

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

解决方案

回答

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

回答

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

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

回答

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

如果要自己中止线程,则必须自己管理线程(以便可以在线程对象上调用Thread.Abort()),或者必须设置某种形式的通知机制,该机制可以让我们告诉线程它应该中止自身。

回答

However, if you are using unmanaged
  resources in those threads, you may
  end up in a lot of trouble.

如果这些非托管资源得到了适当的包装,那么这将取决于我们如何使用它们,然后由它们的包装器终结处理它们,而不管用于杀死引用它们的线程的机制如何。无论如何,当应用程序退出时,操作系统将释放不受管理的资源。

人们普遍感觉(Windows)应用程序花费太多时间试图清理应用程序,而这通常涉及到分派大量内存,只是为了使其可以再次丢弃(或者在释放时运行的分页代码)操作系统将处理的未管理对象)。

回答

是的,它们是背景,但是f.ex如果我们有使用ThreadPool进行某种程度的多次下载或者填充的应用程序,并且想要停止它们,该如何停止?我的建议是:
尽快退出线程,f.ex

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

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

回答

根据卢卡斯·奥尔考斯的回答。

但我们应该使用:

volatile bool stop = false;

告诉编译器此变量由多个线程使用。