How to check whether a thread is a background thread or not in C#

In C#, you can check whether a thread is a background thread using the IsBackground property of the Thread class. Background threads are automatically terminated when all foreground threads complete, while foreground threads keep the application running until they finish execution.

Syntax

Following is the syntax to check if a thread is a background thread −

bool isBackground = thread.IsBackground;

To set a thread as a background thread −

thread.IsBackground = true;

Understanding Background vs Foreground Threads

Background vs Foreground Threads Foreground Thread IsBackground = false Keeps application running until thread completes Default for new threads Background Thread IsBackground = true Terminated when all foreground threads complete ThreadPool threads

Checking Thread Type

Example

using System;
using System.Threading;

public class Demo {
    public static void Main() {
        Thread thread = new Thread(new ThreadStart(demo1));
        ThreadPool.QueueUserWorkItem(new WaitCallback(demo2));
        
        Console.WriteLine("Current state of Thread = " + thread.ThreadState);
        Console.WriteLine("ManagedThreadId = " + thread.ManagedThreadId);
        Console.WriteLine("Is the Thread a background thread? = " + Thread.CurrentThread.IsBackground);
        
        thread.Start();
        Thread.Sleep(100); // Allow ThreadPool thread to execute
    }
    
    public static void demo1() {
        Thread.Sleep(2000);
    }
    
    public static void demo2(object stateInfo) {
        Console.WriteLine("Thread belongs to managed thread pool? = " + Thread.CurrentThread.IsThreadPoolThread);
    }
}

The output of the above code is −

Current state of Thread = Unstarted
ManagedThreadId = 721
Is the Thread a background thread? = False
Thread belongs to managed thread pool? = True

Setting Thread as Background Thread

Example

using System;
using System.Threading;

public class Demo {
    public static void Main() {
        Thread thread = new Thread(new ThreadStart(demo1));
        ThreadPool.QueueUserWorkItem(new WaitCallback(demo2));
        
        Console.WriteLine("Current state of Thread = " + thread.ThreadState);
        Console.WriteLine("ManagedThreadId = " + thread.ManagedThreadId);
        
        thread.IsBackground = true;
        Console.WriteLine("Is the Thread a background thread? = " + thread.IsBackground);
        
        thread.Start();
        Thread.Sleep(100); // Allow ThreadPool thread to execute
    }
    
    public static void demo1() {
        Thread.Sleep(2000);
    }
    
    public static void demo2(object stateInfo) {
        Console.WriteLine("Thread belongs to managed thread pool? = " + Thread.CurrentThread.IsThreadPoolThread);
    }
}

The output of the above code is −

Current state of Thread = Unstarted
ManagedThreadId = 1114
Is the Thread a background thread? = True
Thread belongs to managed thread pool? = True

Practical Example with Different Thread Types

Example

using System;
using System.Threading;

public class ThreadTypeDemo {
    public static void Main() {
        Console.WriteLine("Main Thread IsBackground: " + Thread.CurrentThread.IsBackground);
        
        // Create foreground thread
        Thread foregroundThread = new Thread(PrintThreadInfo);
        foregroundThread.Name = "ForegroundThread";
        
        // Create background thread
        Thread backgroundThread = new Thread(PrintThreadInfo);
        backgroundThread.Name = "BackgroundThread";
        backgroundThread.IsBackground = true;
        
        foregroundThread.Start();
        backgroundThread.Start();
        
        // ThreadPool threads are always background threads
        ThreadPool.QueueUserWorkItem(state => {
            Console.WriteLine($"ThreadPool Thread - Name: {Thread.CurrentThread.Name ?? "Unnamed"}, IsBackground: {Thread.CurrentThread.IsBackground}");
        });
        
        Thread.Sleep(500);
        Console.WriteLine("Main thread ending...");
    }
    
    static void PrintThreadInfo() {
        Console.WriteLine($"Thread - Name: {Thread.CurrentThread.Name}, IsBackground: {Thread.CurrentThread.IsBackground}");
        Thread.Sleep(200);
    }
}

The output of the above code is −

Main Thread IsBackground: False
Thread - Name: ForegroundThread, IsBackground: False
Thread - Name: BackgroundThread, IsBackground: True
ThreadPool Thread - Name: Unnamed, IsBackground: True
Main thread ending...

Key Rules

  • By default, manually created threads are foreground threads (IsBackground = false).

  • ThreadPool threads are always background threads (IsBackground = true).

  • The main application thread is a foreground thread.

  • You can only set IsBackground before starting the thread.

Conclusion

The IsBackground property allows you to check and control whether a thread runs as a background or foreground thread. Background threads are automatically terminated when all foreground threads complete, making them useful for auxiliary tasks that shouldn't prevent application shutdown.

Updated on: 2026-03-17T07:04:36+05:30

272 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements