【问题标题】:Can I make my Thread pool create its threads as foreground?我可以让我的线程池将其线程创建为前台吗?
【发布时间】:2013-01-31 17:01:40
【问题描述】:

默认情况下,.NET 中的线程池使用后台线程。

我无法将其更改为作为前台运行。

如何将其更改为作为前台线程运行?

编辑:

我需要使用它,因为我正在更改我的应用程序由于大量处理(在此之前我手动处理线程,默认情况下是前台线程),我不想更改我的应用程序只是为了适应它到后台线程场景..

我想知道为什么线程池默认不是前台

【问题讨论】:

  • 您希望它们成为前台以防止您的进程终止?您可以保留一个关于您有多少活动后台线程的引用计数,并且在计数达到零之前不会终止您的主(可能是前台,UI)线程。
  • @jeffamaphone +1。闻起来像“我不知道如何正确编程,所以我拿了一把锤子并以某种方式让它工作,滥用我不知道的一切”。
  • 好吧,我不想假设太多,但我确实更喜欢包含为什么你想做某事的问题,因为通常会有更好的方法出现根据经验。
  • “由于大量处理”是什么意思。如果线程池没有所需的行为,那么您应该考虑它可能不是正确的工具。
  • 作为记录,您可以将当前的 ThreadPool 线程更改为前台线程,但这样做是一个糟糕的主意。

标签: c# .net multithreading threadpool


【解决方案1】:

“后台线程”的概念在 .NET 中非常意义不大。 Thread.IsBackground 属性只是一个简单的标志,可帮助 CLR 在 AppDomain 卸载时决定是否应该粗鲁地中止线程,或者是否应该等待线程自愿退出。

如果您希望线程池线程在程序退出时继续运行,您只需更改该属性即可。这个 sn-p 展示了这是如何实现的:

using System;
using System.Threading;

class Program {
    static void Main(string[] args) {
        var sync = new ManualResetEvent(false);
        ThreadPool.QueueUserWorkItem((_) => {
            Console.WriteLine("Running");
            Thread.CurrentThread.IsBackground = false;
            sync.Set();
            Thread.Sleep(5000);
            Console.WriteLine("Done, should exit now");
            Thread.Sleep(250);
        });
        sync.WaitOne();  // Ensures IsBackground is set
    }
}

请注意这里的球。如果这对您很重要,那么您很可能做错了什么。

【讨论】:

    【解决方案2】:

    可以将线程池线程设置为前台。

    class Program
    {
        static void Main(string[] args)
        {
            new Action(() => Worker()).BeginInvoke(null,null);
    
            Thread.Sleep(1000);
            Console.WriteLine("Main ends here");
        }
    
        static void Worker()
        {
            Thread.CurrentThread.IsBackground = false;
    
            Console.WriteLine("Worker started. Bg {0} Tp {1}.", 
                Thread.CurrentThread.IsBackground, 
                Thread.CurrentThread.IsThreadPoolThread);
    
            Thread.Sleep(5000);
            Console.WriteLine("Worker ends here");
    

    【讨论】:

      【解决方案3】:

      我不相信你可以,你必须想出一个自定义的线程池才能做到这一点。

      托管线程池中的线程是后台线程。也就是说,它们的 IsBackground 属性为真。这意味着 ThreadPool 线程不会在所有前台线程都退出后继续运行应用程序。

      何时不使用线程池线程

      有几种情况适合创建和 管理自己的线程而不是使用线程池线程:

      • 您需要一个前台线程。

      From this link And This One

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-10
        • 1970-01-01
        • 1970-01-01
        • 2019-08-06
        • 1970-01-01
        • 2012-06-22
        相关资源
        最近更新 更多