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.
| Constructor | Description |
|---|
| 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...!!");
}
}
}
OutputMy Thread is in progress...!!
My Thread is in progress...!!
Properties
| Property | Description |
|---|
| ApartmentState | Gets or sets the apartment state of this thread. |
|---|
| CurrentContext | Gets the current context in which the thread is executing. |
|---|
| CurrentCulture | Gets or sets the culture for the current thread. |
|---|
| CurrentPrincipal | Gets or sets the thread’s current principal (used for role-based security). |
|---|
| CurrentThread | Gets the currently running thread. |
|---|
| CurrentUICulture | Gets or sets the culture used by the ResourceManager to look up culture-specific resources at runtime. |
|---|
| ExecutionContext | Gets an ExecutionContext object containing information about the various contexts of the current thread. |
|---|
| IsAlive | Gets a value indicating the execution status of the current thread. |
|---|
| IsBackground | Gets or sets a value indicating whether a thread is a background thread. |
|---|
| IsThreadPoolThread | Gets a value indicating whether a thread belongs to the managed thread pool. |
|---|
| ManagedThreadId | Gets a unique identifier for the current managed thread. |
|---|
| Name | Gets or sets the name of the thread. |
|---|
| Priority | Gets or sets the scheduling priority of a thread. |
|---|
| ThreadState | Gets 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);
}
}
OutputThe 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#
| Method | Description |
|---|
| 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
| Method | Description |
|---|
| 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
Introduction
Fundamentals
Control Statements
OOP Concepts
Methods
Arrays
ArrayList
String
Tuple
Indexers