ThreadPriority Enumeration


The .NET API Reference documentation has a new home. Visit the .NET API Browser on to see the new experience.

Specifies the scheduling priority of a Thread.

Namespace:   System.Threading
Assembly:  mscorlib (in mscorlib.dll)

public enum ThreadPriority

Member nameDescription

The Thread can be scheduled after threads with Highest priority and before those with Normal priority.


The Thread can be scheduled after threads with Normal priority and before those with Lowest priority.


The Thread can be scheduled before threads with any other priority.


The Thread can be scheduled after threads with any other priority.


The Thread can be scheduled after threads with AboveNormal priority and before those with BelowNormal priority. Threads have Normal priority by default.

ThreadPriority defines the set of all possible values for a thread priority. Thread priorities specify the relative priority of one thread versus another.

Every thread has an assigned priority. Threads created within the runtime are initially assigned the Normal priority, while threads created outside the runtime retain their previous priority when they enter the runtime. You can get and set the priority of a thread by accessing its Priority property.

Threads are scheduled for execution based on their priority. The scheduling algorithm used to determine the order of thread execution varies with each operating system. The operating system can also adjust the thread priority dynamically as the user interface's focus is moved between the foreground and the background.

The priority of a thread does not affect the thread's state; the state of the thread must be Running before the operating system can schedule it.

The following code example shows the result of changing the priority of a thread. Three threads are created, the priority of one thread is set to ThreadPriority.BelowNormal, and the priority of a second is set to ThreadPriority.AboveNormal. Each thread increments a variable in a while loop and runs for a set time.

using System;
using System.Threading;
using Timers = System.Timers;

class Test
    static void Main()
        PriorityTest priorityTest = new PriorityTest();

        Thread thread1 = new Thread(priorityTest.ThreadMethod);
        thread1.Name = "ThreadOne";
        Thread thread2 = new Thread(priorityTest.ThreadMethod);
        thread2.Name = "ThreadTwo";
        thread2.Priority = ThreadPriority.BelowNormal;
        Thread thread3 = new Thread(priorityTest.ThreadMethod);
        thread3.Name = "ThreadThree";
        thread3.Priority = ThreadPriority.AboveNormal;

        // Allow counting for 10 seconds.
        priorityTest.LoopSwitch = false;

class PriorityTest
    static bool loopSwitch;
    [ThreadStatic] static long threadCount = 0;

    public PriorityTest()
        loopSwitch = true;

    public bool LoopSwitch
        set{ loopSwitch = value; }

    public void ThreadMethod()
        Console.WriteLine("{0,-11} with {1,11} priority " +
            "has a count = {2,13}", Thread.CurrentThread.Name, 
// The example displays output like the following:
//    ThreadOne   with      Normal priority has a count =   755,897,581
//    ThreadThree with AboveNormal priority has a count =   778,099,094
//    ThreadTwo   with BelowNormal priority has a count =     7,840,984

.NET Framework
Available since 1.1
Return to top