C# 我可以让我的线程池创建它的线程作为前台吗?

C# 我可以让我的线程池创建它的线程作为前台吗?,c#,.net,multithreading,threadpool,C#,.net,Multithreading,Threadpool,默认情况下,.NET中的线程池与后台线程一起工作 我无法将其更改为作为前台运行 class Program { static void Main(string[] args) { new Action(() => Worker()).BeginInvoke(null,null); Thread.Sleep(1000); Console.WriteLine("Main ends here"); } stati

默认情况下,.NET中的线程池与后台线程一起工作

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

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");
如何将其更改为作为前台线程运行

编辑:

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


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

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

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

何时不使用线程池线程

在几种情况下,创建和修改 管理您自己的线程,而不是使用线程池线程:

  • 你需要一个前台线程
在.NET中,“后台线程”的概念意义不大。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
    }
}

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

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

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");

您希望它们成为前台,以防止进程终止?您可以保留一个引用计数,以确定有多少活动后台线程在计数达到零之前不会终止主线程(可能是前台,UI)。@jeffamaphone+1。闻起来像是“我不知道如何正确地编程,所以我拿着锤子,不知怎么地让它工作,滥用我不知道的一切”。好吧,我不想假设太多,但我更喜欢问一些问题,包括为什么你想做某事,因为通常有一种更好的方法来自经验。你说的是什么如果线程池没有期望的行为,那么您应该考虑它不是正确的工具。对于记录,您可以将当前线程池线程更改为前台线程,但这样做是一个可怕的想法。