11

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

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

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

编辑:

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

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

4

3 回答 3

19

“后台线程”的概念在 .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
    }
}

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

于 2013-01-31T17:55:10.623 回答
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");
于 2013-01-31T23:24:57.050 回答
0

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

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

何时不使用线程池线程

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

  • 您需要一个前台线程。

从这个链接 和这个

于 2013-01-31T17:13:06.547 回答