2013-01-31 51 views
8

默认情况下,.NET中的线程池适用于后台线程。我可以让我的线程池创建它的线程为前景吗?

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

我该如何改变它作为前台线程运行?

编辑:

我需要用这个,因为我改变了我的应用程序,由于大批量处理(我是手动处理线程,这是默认前景的人之前),我不想改变我的应用程序只是为了使其适应背景线程场景..

我不知道为什么线程池默认情况下不前景色

+3

你想让它们成为前景来阻止你的进程终止吗?您可以保留一个引用计数,以确定您有多少个活动后台线程不会终止您的主线程(可能是前台,UI)线程,直到计数达到零。 –

+3

@jeffamaphone +1。闻起来像“我不知道如何正确编程,所以我拿着一把锤子,并以某种方式让它工作,滥用我不知道的一切”。 – TomTom

+0

嗯,我不想假设太多,但我更喜欢其中包括*为什么*你想做什么的问题,因为经常有更好的方法来自经验。 –

回答

16

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

如果您希望线程池线程在程序退出时保持运行,您可以只更改该属性。这段代码展示了这是如何实现的:

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 
    } 
} 

请保持你的眼睛在这里的球。如果这对你很重要,那么很有可能你做错了什么。

0

我不相信你可以,你将不得不拿出一个自定义ThreadPool为了做到这一点。

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

何时不使用线程池中的线程

有几种方案中,它是适当的创建和 管理自己的线程,而不是使用线程池中的线程:

  • 您需要前景线程。

From this link And This One

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"); 
相关问题