
Introduction
āĻāĻāĻā§āϰ āϏāĻĢāĻāĻā§ā§āϝāĻžāϰ āĻĻā§āύāĻŋā§āĻžā§ speed āĻāĻŦāĻ responsiveness āĻā§āĻŦāĻ āĻā§āϰā§āϤā§āĻŦāĻĒā§āϰā§āĻŖāĨ¤ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰāĻž āĻāĻžā§, āϤāĻžāĻĻā§āϰ āĻ ā§āϝāĻžāĻĒā§āϞāĻŋāĻā§āĻļāύ āϝā§āύ āĻāĻāĻ āϏāĻŽā§ā§ āĻāĻāĻžāϧāĻŋāĻ āĻāĻžāĻ āĻāϰāϤ⧠āĻĒāĻžāϰā§āĨ¤ āϝā§āĻŽāύâ
- āĻā§ā§āĻŦ āϏāĻžāϰā§āĻāĻžāϰ āĻāĻāĻāϏāĻžāĻĨā§ āĻšāĻžāĻāĻžāϰ⧠āĻāĻāĻāĻžāϰā§āϰ request āĻšā§āϝāĻžāύā§āĻĄā§āϞ āĻāϰāĻŦā§
- āĻŽā§āĻŦāĻžāĻāϞ āĻ ā§āϝāĻžāĻĒ āĻĢāĻžāĻāϞ āĻĄāĻžāĻāύāϞā§āĻĄ āĻāϰāĻžāϰ āϏāĻŽā§āĻ responsive āĻĨāĻžāĻāĻŦā§
- Desktop UI āĻ ā§āϝāĻžāĻĒ āĻŦā§āϝāĻžāĻāĻā§āϰāĻžāĻāύā§āĻĄā§ calculation āĻāϰāϞā§āĻ āĻĢā§āϰāĻŋāĻ āĻāϰāĻŦā§ āύāĻž
āĻāĻ āϏāĻŦāĻāĻŋāĻā§āϰ āĻāύā§āϝāĻ Multithreading āĻĻāϰāĻāĻžāϰāĨ¤ C# āĻāĻŦāĻ .NET Framework āĻ multithreading āĻāϤ āĻļāĻā§āϤāĻŋāĻļāĻžāϞā§āĻāĻžāĻŦā§ āϤā§āϰāĻŋ āĻāϰāĻž āĻšā§ā§āĻā§ āϝ⧠āĻā§āĻ āĻĨā§āĻā§ āĻŦā§ āϏāĻŦ āϧāϰāĻŖā§āϰ āϏāĻŋāϏā§āĻā§āĻŽā§āĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āϝāĻžā§āĨ¤
Multithreading vs Multiprocessing
āĻĒā§āϰāĻĨāĻŽā§āĻ āĻāĻāĻāĻž āĻĒāϰāĻŋāώā§āĻāĻžāϰ āϧāĻžāϰāĻŖāĻž āĻĨāĻžāĻāĻž āĻĻāϰāĻāĻžāϰ:
- Multithreading â āĻāĻāĻ āĻĒā§āϰāϏā§āϏā§āϰ āĻā§āϤāϰ⧠āĻāĻāĻžāϧāĻŋāĻ āĻĨā§āϰā§āĻĄ parallel āĻ āĻāĻžāĻ āĻāϰā§āĨ¤
- Multiprocessing â āĻāϞāĻžāĻĻāĻž āĻāϞāĻžāĻĻāĻž āĻĒā§āϰāϏā§āϏ parallel āĻ āĻāϞā§, āĻĒā§āϰāϤā§āϝā§āĻāĻāĻž āĻĒā§āϰāϏā§āϏā§āϰ āύāĻŋāĻāϏā§āĻŦ memory āĻĨāĻžāĻā§āĨ¤
đĄ āĻāĻĻāĻžāĻšāϰāĻŖ:
- Google Chrome āĻ āĻĒā§āϰāϤāĻŋāĻāĻž Tab āĻāĻāĻāĻž processāĨ¤
- āĻāĻŋāύā§āϤ⧠āĻĒā§āϰāϤāĻŋāĻāĻž Tab āĻāϰ āĻā§āϤāϰ⧠āĻāĻŦāĻžāϰ āĻāĻāĻžāϧāĻŋāĻ thread āĻāϞ⧠(rendering, JS execution, network handling āĻāϤā§āϝāĻžāĻĻāĻŋ)āĨ¤
Creating a Thread in C#
C# āĻ multithreading āĻļā§āϰ⧠āĻāϰāĻžāϰ āϏāĻŦāĻā§ā§ā§ āϏāĻšāĻ āĻāĻĒāĻžā§ āĻšāϞ⧠Thread
āĻā§āϞāĻžāϏ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻžāĨ¤
1. Using the Thread
Class
using System;
using System.Threading;
class Program
{
static void PrintNumbers()
{
for (int i = 1; i <= 5; i++)
{
Console.WriteLine($"Thread: {i}");
Thread.Sleep(500); // simulate work
}
}
static void Main()
{
Thread t = new Thread(PrintNumbers);
t.Start();
for (int i = 1; i <= 5; i++)
{
Console.WriteLine($"Main: {i}");
Thread.Sleep(500);
}
}
}
đ āĻāĻāĻžāύ⧠Main
thread āĻāϰ āύāϤā§āύ āϤā§āϰāĻŋ āĻāϰāĻž thread āĻāĻāĻ āϏāĻžāĻĨā§ āĻāĻžāĻ āĻāϰāĻā§āĨ¤
Output interleaved āĻšāĻŦā§, āĻŽāĻžāύ⧠āĻāĻāύ⧠Main āĻāĻā§ āĻāϏāĻŦā§, āĻāĻāύ⧠Thread āĻāĻā§ āĻāϏāĻŦā§āĨ¤
2. Thread with Lambda Expression
Thread t = new Thread(() =>
{
Console.WriteLine("Thread started with Lambda!");
});
t.Start();
āĻāĻāĻž āĻā§āĻ āĻāĻžāĻā§āϰ āĻāύā§āϝ āĻā§āĻŦāĻ handyāĨ¤
Thread Lifecycle
āĻāĻāĻāĻž thread āĻŦāĻŋāĻāĻŋāύā§āύ state āĻāϰ āĻŽāϧā§āϝ āĻĻāĻŋā§ā§ āϝāĻžā§:
- Unstarted â Thread āϤā§āϰāĻŋ āĻšā§ā§āĻā§ āĻāĻŋāύā§āϤ⧠āĻāĻžāϞ⧠āĻšā§āύāĻŋāĨ¤
- Running â CPU āϤ⧠āĻāϞāĻā§āĨ¤
- Wait/Sleep/Join â āĻāĻŋāĻā§āĻā§āώāĻŖ pause āĻāĻā§āĨ¤
- Stopped â āĻāĻžāĻ āĻļā§āώ āĻāϰ⧠āĻŦā§āϰ āĻšā§ā§ āĻā§āĻā§āĨ¤
(āĻāĻāĻžāύ⧠āĻāĻāĻāĻž lifecycle diagram āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϞ⧠āĻāϰāĻ āĻĒāϰāĻŋāώā§āĻāĻžāϰ āĻšāĻŦā§āĨ¤)
Common Pitfalls in Multithreading
Multithreading āĻļāĻā§āϤāĻŋāĻļāĻžāϞ⧠āĻšāϞā§āĻ āĻā§āϞ āĻāϰāϞ⧠āĻŽāĻžāϰāĻžāϤā§āĻŽāĻ bug āϤā§āϰāĻŋ āĻšāϤ⧠āĻĒāĻžāϰā§āĨ¤
1. Race Condition
āϝāĻāύ āĻāĻāĻžāϧāĻŋāĻ thread āĻāĻāĻ data modify āĻāϰā§, āϤāĻāύ race condition āĻšā§āĨ¤
class Counter
{
public int Value = 0;
public void Increment()
{
Value++; // Not thread-safe!
}
}
đ Value++
āĻāĻāϏāĻžāĻĨ⧠⧍āĻāĻž thread āĻāϰāϞ⧠āĻĢāϞāĻžāĻĢāϞ āĻā§āϞāĻŋā§ā§ āϝāĻžāĻŦā§āĨ¤
2. Deadlock
Deadlock āĻšāϞ⧠āϝāĻāύ āĻĻā§āĻ āĻŦāĻž āϤāĻžāϰ āĻŦā§āĻļāĻŋ thread āĻāĻā§ āĻ āĻĒāϰā§āϰ lock āĻāϰ āĻāύā§āϝ āĻ āĻĒā§āĻā§āώāĻž āĻāϰāϤ⧠āĻĨāĻžāĻā§āĨ¤
object lock1 = new object();
object lock2 = new object();
Thread t1 = new Thread(() =>
{
lock (lock1)
{
Thread.Sleep(100);
lock (lock2) { Console.WriteLine("Thread 1 done"); }
}
});
Thread t2 = new Thread(() =>
{
lock (lock2)
{
Thread.Sleep(100);
lock (lock1) { Console.WriteLine("Thread 2 done"); }
}
});
t1.Start();
t2.Start();
đ āĻāĻāĻžāύ⧠t1
āĻāĻŦāĻ t2
āĻāĻā§ āĻ
āĻĒāϰāĻā§ āĻāĻŋāϰāĻĻāĻŋāύā§āϰ āĻāύā§āϝ wait āĻāϰāĻžāĻŦā§āĨ¤
Best Practices for Beginners
- Directly
Thread
āĻā§āϞāĻžāϏ āĻŦā§āϝāĻŦāĻšāĻžāϰ āύāĻž āĻāϰ⧠āĻŦāϰāĻTask
āĻŦāĻžThreadPool
āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύ (āĻāĻā§āϞ⧠efficient)āĨ¤ - āϏāĻŦāϏāĻŽā§ synchronization primitives (lock, Monitor, Mutex āĻāϤā§āϝāĻžāĻĻāĻŋ) āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύāĨ¤
- Deadlock āĻā§āĻžāϤ⧠consistent lock order follow āĻāϰā§āύāĨ¤
- Multithreading debug āĻāϰāĻžāϰ āϏāĻŽā§ Visual Studio Diagnostic Tools āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύāĨ¤
Conclusion
Multithreading āĻšāϞ⧠C# āĻāϰ āĻāĻ āĻļāĻā§āϤāĻŋāĻļāĻžāϞ⧠āĻĢāĻŋāĻāĻžāϰ, āϝāĻž āĻāĻĒāύāĻžāĻā§ parallel āĻāĻŦāĻ responsive application āϤā§āϰāĻŋ āĻāϰāϤ⧠āϏāĻžāĻšāĻžāϝā§āϝ āĻāϰā§āĨ¤ āϤāĻŦā§ āĻāϰ āϏāĻžāĻĨā§ āĻāϏ⧠āĻāĻŋāĻā§ challenge āϝā§āĻŽāύ race condition āĻāĻŦāĻ deadlockāĨ¤