Поделиться через


ThreadPriority Перечисление

Определение

Указывает приоритет планирования Thread.

public enum class ThreadPriority
public enum ThreadPriority
[System.Serializable]
public enum ThreadPriority
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public enum ThreadPriority
type ThreadPriority = 
[<System.Serializable>]
type ThreadPriority = 
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type ThreadPriority = 
Public Enum ThreadPriority
Наследование
ThreadPriority
Атрибуты

Поля

Имя Значение Описание
Lowest 0

Его Thread можно запланировать после потоков с любым другим приоритетом.

BelowNormal 1

Его Thread можно запланировать после потоков с Normal приоритетом и перед этими потоками с Lowest приоритетом.

Normal 2

Его Thread можно запланировать после потоков с AboveNormal приоритетом и перед этими потоками с BelowNormal приоритетом. Потоки имеют Normal приоритет по умолчанию.

AboveNormal 3

Его Thread можно запланировать после потоков с Highest приоритетом и перед этими потоками с Normal приоритетом.

Highest 4

Его Thread можно запланировать перед потоками с любым другим приоритетом.

Примеры

В следующем примере кода показан результат изменения приоритета потока. Создаются три потока, приоритет одного потока имеет значение BelowNormal, а приоритет второго — "НадНормаль". Каждый поток увеличивает переменную в цикле while и выполняется в течение заданного времени.

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;

        thread1.Start();
        thread2.Start();
        thread3.Start();
        // Allow counting for 10 seconds.
        Thread.Sleep(10000);
        priorityTest.LoopSwitch = false;
    }
}

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

    public PriorityTest()
    {
        loopSwitch = true;
    }

    public bool LoopSwitch
    {
        set{ loopSwitch = value; }
    }

    public void ThreadMethod()
    {
        while(loopSwitch)
        {
            threadCount++;
        }
        Console.WriteLine("{0,-11} with {1,11} priority " +
            "has a count = {2,13}", Thread.CurrentThread.Name, 
            Thread.CurrentThread.Priority.ToString(), 
            threadCount.ToString("N0")); 
    }
}
// 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
Imports System.Threading
Imports Timers = System.Timers

Public Module Example
   Dim t As Timers.Timer
   Private priorityTest As New PriorityTest()

    Public Sub Main()
        Dim thread1 As New Thread(AddressOf priorityTest.ThreadMethod)
        thread1.Name = "ThreadOne"
        Dim thread2 As New Thread(AddressOf priorityTest.ThreadMethod)
        thread2.Name = "ThreadTwo"
        thread2.Priority = ThreadPriority.BelowNormal
        Dim thread3 As New Thread(AddressOf priorityTest.ThreadMethod)
        thread3.Name = "ThreadThree"
        thread3.Priority = ThreadPriority.AboveNormal
        thread1.Start()
        thread2.Start()
        thread3.Start()

        ' Allow threads to execute for about 10 seconds.
        t = New Timers.Timer()
        t.AutoReset = False
        t.Interval = 10000
        AddHandler t.Elapsed, AddressOf Elapsed
        t.Start()
    End Sub

    Private Sub Elapsed(sender As Object, e As Timers.ElapsedEventArgs)
       priorityTest.LoopSwitch = False
    End Sub
End Module

Public Class PriorityTest
    Private Shared loopSwitchValue As Boolean
    <ThreadStatic> Shared threadCount As Long

    Sub New()
        loopSwitchValue = True
    End Sub

    WriteOnly Property LoopSwitch As Boolean
        Set
            loopSwitchValue = Value
        End Set
    End Property

    Sub ThreadMethod()
        Do While True
            threadCount += 1
            If Not loopSwitchValue Then Exit Do
        Loop

        Console.WriteLine("{0,-11} with {1,11} priority " &
            "has a count = {2,13}", Thread.CurrentThread.Name,
            Thread.CurrentThread.Priority.ToString(),
            threadCount.ToString("N0")) 
    End Sub
End Class
' The example displays the following output:
'    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

Комментарии

ThreadPriority определяет набор всех возможных значений для приоритета потока. Приоритеты потоков указывают относительный приоритет одного потока и другого.

Каждый поток имеет назначенный приоритет. Потоки, созданные в среде выполнения, изначально назначаются приоритетом Normal , а потоки, созданные вне среды выполнения, сохраняют свой предыдущий приоритет при входе в среду выполнения. Вы можете получить и задать приоритет потока, доступ к его Priority свойству.

Потоки планируются для выполнения, учитывая их приоритеты. Алгоритм планирования, используемый для определения порядка выполнения потока, зависит от каждой операционной системы. Операционная система также может динамически настраивать приоритет потока, так как фокус пользовательского интерфейса перемещается между передним планом и фоном.

Приоритет потока не влияет на состояние потока; Состояние потока должно быть Running до того, как операционная система сможет запланировать его.

Применяется к

См. также раздел