Thread Priority- A thread’s Priority property determines how much execution time it gets relative to other active threads in the operating system.
Thread priorities in C# are available in ThreadPriority class from namespace System.Threading; Below C# thread priority can be assigned to a thread.
- Highest
- AboveNormal
- Normal
- BelowNormal
- Lowest
By default “Normal” thread priority is assigned to a thread in C#.
Thread scheduler of operating system schedules all threads according to their thread priority for execution, but with no guarantee. Operating system may or may not respect the priority of thread. Means, it is not necessary that highest priority thread will always execute first and lower priority thread will execute last. Lowest priority thread will run slower, but not completely stop.
Note that operating system do not ignore priority completely and always try to complete high priority task first.
If we execute the below software program – C# thread priority example, you should find completion of highest priority thread first most of the time.
Program for thread Priority in C#
To check the desired result i.e. high priority thread complete its task first and low priority threads complete at later on the basis of above concepts, we will consider three threads performing the same amount of task.
Also, to notice the desired result, we need to give long task to threads as for smaller task we will not be able to see execution of thread in priory order.
Here we have given highest priority to third thread and lowest priority to first one. In the result most of the time you would see the completion for the third thread first and first one to last.
C# Thread Priority Example
Code
class Program
{
static void Main(string[] args)
{
//Create threads
Thread t1 = new Thread(function1st);
Thread t2 = new Thread(function2nd);
Thread t3 = new Thread(function3rd);
//Set priorities to all threads
t1.Priority = ThreadPriority.Lowest;
t2.Priority = ThreadPriority.Normal;
t3.Priority = ThreadPriority.Highest;
t1.Start();
t2.Start();
t3.Start();
t3.Join();
}
static void function1st()
{
task();
Console.WriteLine("Thread 1st completed");
}
static void function2nd()
{
task();
Console.WriteLine("Thread 2nd completed");
}
static void function3rd()
{
task();
Console.WriteLine("Thread 3rd completed");
}
//All thread will perform the same task.
static void task()
{
//perform some task
for (int i = 0; i < 10; i++)
{
Console.Write("Value:\t" + i);
}
}
}
Output
Value: 0Value: 0Value: 0Value: 1Value: 2Value: 3Value: 4Value: 5Value: 6Value:
7Value: 8Value: 9Thread 2nd completed
Value: 1Value: 2Value: 3Value: 4Value: 5Value: 6Value: 7Value: 8Value: 9Thread
1st completed
Value: 1Value: 2Value: 3Value: 4Value: 5Value: 6Value: 7Value: 8Value: 9Thread
3rd completed
Conclusion:
- Thread scheduler of operating system schedule threads with no guarantee but tries to consider them.
- For long running task threads get the benefit of priority setting.