如何中止使用ThreadPool.QueueUserWorkItem创建的线程
有没有办法中止用QueueUserWorkItem创建的线程?
或者我可能不需要? 如果主应用程序退出会发生什么? 从它创建的所有线程是否自动中止?
你不需要中止它们。 当您的应用程序退出时,.NET将终止所有IsBackground = true的线程。 .NET threadpool的所有线程都设置为IsBackground = true,因此您不必担心它。
现在,如果您通过新建Thread类来创建线程,那么您将需要中止它们或将其IsBackground属性设置为true。
但是,如果您在这些线程中使用非托管资源,则可能会遇到很多麻烦。
这取决于你如何使用它们 – 如果这些非托管资源被正确包装,那么它们将通过它们的包装器终结来处理,而不管用于杀死引用它们的线程的机制。 无论如何,当应用程序退出时,操作系统将释放非托管资源。
人们普遍认为(Windows)应用程序花费了太多时间来尝试清理应用程序关闭 – 通常涉及分页 – 大量内存只是为了可以再次丢弃(或者代码中的分页代码)释放操作系统无论如何都要处理的非管理对象。
线程池使用后台线程。 因此,当应用程序退出时,它们将全部自动关闭。
如果你想自己中止一个线程,你必须自己管理线程(所以你可以在线程对象上调用Thread.Abort())或者你必须设置某种forms的通知机制,它会让你告诉线程它应该中止自己。
是他们会。 但是,如果您在这些线程中使用非托管资源,则可能会遇到很多麻烦。
是的,他们是背景,但是f.ex如果你有应用程序你使用ThreadPool进行某种多样的下载或者东西,你想要阻止它们,你怎么停止? 我的建议是:退出线程asap,f.ex
bool stop = false; void doDownloadWork(object s) { if (!stop) { DownloadLink((String)s, location); } }
如果设置stop = true,则在队列线程完成处理后,第二个(当前在队列中)线程会自动退出。
根据LukasŠalkauskas的回答。
但你应该使用:
volatile bool stop = false;
告诉编译器这个变量被多个线程使用。
上述就是C#学习教程:如何中止使用ThreadPool.QueueUserWorkItem创建的线程分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1034484.html