Open In App

C# Thread Class

Last Updated : 19 Sep, 2025
Comments
Improve
Suggest changes
3 Likes
Like
Report

The Thread class in C# is part of the System.Threading namespace and provides the fundamental way to create and control threads. A thread represents a path of execution within a process, and using the Thread class you can start, pause, resume, or terminate tasks running concurrently with the main program.

  • Defined in System using Threading namespace.
  • Represents a single thread of execution.
  • Can be created using a delegate (method reference or lambda expression).
  • Supports foreground and background modes.
  • Provides properties like Name, IsAlive, Priority, and methods like Start(), Sleep(), Abort(), Join().

Creating and Starting a Thread

C#
using System;
using System.Threading;

class Program {
    static void PrintNumbers() {
        for (int i = 1; i <= 5; i++) {
            Console.WriteLine("Worker Thread: " + i);
            Thread.Sleep(500);
        }
    }

    static void Main() {
        Thread t1 = new Thread(PrintNumbers);
        t1.Start();

        for (int i = 1; i <= 5; i++) {
            Console.WriteLine("Main Thread: " + i);
            Thread.Sleep(500);
        }
    }
}

Output:

Worker Thread: 1

Main Thread: 1

Worker Thread: 2

Main Thread: 2

...

Explanation:

  • The main thread and worker thread run concurrently.
  • Thread.Sleep(500) pauses execution for half a second, simulating work.

Syntax of C# Thread Class:

Thread t = new Thread(MethodName);
t.Start();

Here:

  • Thread is the class.
  • MethodName is the method that the thread will execute.
  • Start() begins execution of the thread.

Passing Data to a Thread

The Thread class allows passing data through ParameterizedThreadStart or lambda expressions.

1. Using ParameterizedThreadStart

C#
class Program {
    static void PrintMessage(object msg) {
        Console.WriteLine("Message: " + msg);
    }

    static void Main() {
        Thread t = new Thread(PrintMessage);
        t.Start("Hello from Thread");
    }
}

Output:

Message: Hello from Thread

2. Using Lambda Expressions

C#
Thread t = new Thread(() => {
    Console.WriteLine("Message from Lambda Thread");
});
t.Start();

Constructor

The Thread class provides multiple constructors to create and initialize threads with or without parameters, and with optional stack size specification.

ConstructorDescription
Thread(ParameterizedThreadStart)Initializes a new instance of the Thread class, specifying a delegate that allows an object to be passed to the thread when it starts.
Thread(ParameterizedThreadStart, int)Creates a new Thread instance with a delegate for object passing and sets the maximum stack size.
Thread(ThreadStart)Initializes a new instance of the Thread class without parameters.
Thread(ThreadStart, int)Initializes a new instance of the Thread class, specifying the maximum stack size.

Example: Using ThreadStart Constructor

C#
using System;
using System.Threading;

public class Geeks {
    public static void Main() {
        // Creating and initializing thread using Thread class and ThreadStart constructor
        Thread t = new Thread(new ThreadStart(Task));
        t.Start();
    }

    public static void Task() {
        for (int j = 0; j < 2; j++) {
            Console.WriteLine("My Thread is in progress...!!");
        }
    }
}

Output
My Thread is in progress...!!
My Thread is in progress...!!

Properties

PropertyDescription
ApartmentStateGets or sets the apartment state of this thread.
CurrentContextGets the current context in which the thread is executing.
CurrentCultureGets or sets the culture for the current thread.
CurrentPrincipalGets or sets the thread’s current principal (used for role-based security).
CurrentThreadGets the currently running thread.
CurrentUICultureGets or sets the culture used by the ResourceManager to look up culture-specific resources at runtime.
ExecutionContextGets an ExecutionContext object containing information about the various contexts of the current thread.
IsAliveGets a value indicating the execution status of the current thread.
IsBackgroundGets or sets a value indicating whether a thread is a background thread.
IsThreadPoolThreadGets a value indicating whether a thread belongs to the managed thread pool.
ManagedThreadIdGets a unique identifier for the current managed thread.
NameGets or sets the name of the thread.
PriorityGets or sets the scheduling priority of a thread.
ThreadStateGets a value containing the states of the current thread.

Example: set and get the priority of threads

C#
using System;
using System.Threading;

class Geeks
{
	static public void Main()
	{
		// Creating and initializing threads
		Thread t1 = new Thread(work);
		Thread t2 = new Thread(work);
		Thread t3 = new Thread(work);

		// Set the priority of threads
		t2.Priority = ThreadPriority.Lowest;
		t3.Priority = ThreadPriority.AboveNormal;
		t1.Start();
		t2.Start();
		t3.Start();

		// Display the priority of threads
		Console.WriteLine("The priority of Thread 1 is: {0}",
		t1.Priority);

		Console.WriteLine("The priority of Thread 2 is: {0}",
		t2.Priority);

		Console.WriteLine("The priority of Thread 3 is: {0}",
		t3.Priority);
	}

	public static void work()
	{
		// Sleep for 100 milliseconds
		Thread.Sleep(100);
	}
}

Output
The priority of Thread 1 is: Normal
The priority of Thread 2 is: Lowest
The priority of Thread 3 is: AboveNormal

Commonly Used Methods of the Thread Class in C#

MethodDescription
Start()Begins execution of the thread.
Sleep(Int32)Suspends the current thread for a specified time.
Join()Blocks the calling thread until the target thread finishes.
Abort()Terminates a thread (obsolete in modern .NET, not recommended).
Interrupt()Interrupts a thread in Wait, Sleep, or Join state.
Suspend()Suspends a thread (obsolete, not recommended).
Resume()Resumes a suspended thread (obsolete, not recommended).
Yield()Temporarily releases the processor to allow other threads to run.
SpinWait(Int32)Makes the thread wait actively for a set number of iterations.

Less Frequently Used / Advanced Methods

MethodDescription
GetApartmentState() / SetApartmentState(ApartmentState)Gets or sets the apartment state of a thread.
AllocateDataSlot() / AllocateNamedDataSlot(String)Creates thread-local data slots.
GetData(LocalDataStoreSlot) / SetData(LocalDataStoreSlot, Object)Stores or retrieves thread-specific data.
FreeNamedDataSlot(String)Frees a named data slot.
BeginCriticalRegion() / EndCriticalRegion()Marks a region where aborts or exceptions affect the application domain.
BeginThreadAffinity() / EndThreadAffinity()Marks code that depends on the identity of the physical OS thread.
MemoryBarrier()Ensures correct ordering of memory operations across threads.
VolatileRead() / VolatileWrite()Provides thread-safe memory read/write operations.

Example: Using Start, Sleep, and Join

C#
using System;
using System.Threading;

class Program {
    static void Task1() {
        for (int i = 0; i < 3; i++) {
            Console.WriteLine("Task1 running...");
            Thread.Sleep(500);
        }
    }

    static void Main() {
        Thread t = new Thread(Task1);
        t.Start();          // Start the thread
        t.Join();           // Wait until thread finishes
        Console.WriteLine("Main thread finished");
    }
}

Output:

Task1 running...

Task1 running...

Task1 running...

Main thread finished


Explore