Thread Класс
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Создает и контролирует поток, задает приоритет и возвращает статус.
public ref class Thread sealed : System::Runtime::ConstrainedExecution::CriticalFinalizerObject
public ref class Thread sealed
public ref class Thread sealed : System::Runtime::InteropServices::_Thread
public ref class Thread sealed : System::Runtime::ConstrainedExecution::CriticalFinalizerObject, System::Runtime::InteropServices::_Thread
public sealed class Thread : System.Runtime.ConstrainedExecution.CriticalFinalizerObject
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class Thread
[System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.None)]
public sealed class Thread : System.Runtime.InteropServices._Thread
[System.Runtime.InteropServices.ComVisible(true)]
[System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.None)]
public sealed class Thread : System.Runtime.ConstrainedExecution.CriticalFinalizerObject, System.Runtime.InteropServices._Thread
[System.Runtime.InteropServices.ComVisible(true)]
[System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.None)]
public sealed class Thread : System.Runtime.ConstrainedExecution.CriticalFinalizerObject
type Thread = class
inherit CriticalFinalizerObject
[<System.Runtime.InteropServices.ComVisible(true)>]
type Thread = class
[<System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.None)>]
type Thread = class
interface _Thread
[<System.Runtime.InteropServices.ComVisible(true)>]
[<System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.None)>]
type Thread = class
inherit CriticalFinalizerObject
interface _Thread
[<System.Runtime.InteropServices.ComVisible(true)>]
[<System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.None)>]
type Thread = class
inherit CriticalFinalizerObject
Public NotInheritable Class Thread
Inherits CriticalFinalizerObject
Public NotInheritable Class Thread
Public NotInheritable Class Thread
Implements _Thread
Public NotInheritable Class Thread
Inherits CriticalFinalizerObject
Implements _Thread
- Наследование
- Наследование
-
Thread
- Атрибуты
- Реализации
Примеры
В следующем примере демонстрируются простые функции работы с потоками.
// [C++]
// Compile using /clr option.
using namespace System;
using namespace System::Threading;
// Simple threading scenario: Start a Shared method running
// on a second thread.
public ref class ThreadExample
{
public:
// The ThreadProc method is called when the thread starts.
// It loops ten times, writing to the console and yielding
// the rest of its time slice each time, and then ends.
static void ThreadProc()
{
for ( int i = 0; i < 10; i++ )
{
Console::Write( "ThreadProc: " );
Console::WriteLine( i );
// Yield the rest of the time slice.
Thread::Sleep( 0 );
}
}
};
int main()
{
Console::WriteLine( "Main thread: Start a second thread." );
// Create the thread, passing a ThreadStart delegate that
// represents the ThreadExample::ThreadProc method. For a
// delegate representing a static method, no object is
// required.
Thread^ oThread = gcnew Thread( gcnew ThreadStart( &ThreadExample::ThreadProc ) );
// Start ThreadProc. Note that on a uniprocessor, the new
// thread does not get any processor time until the main thread
// is preempted or yields. Uncomment the Thread::Sleep that
// follows oThread->Start() to see the difference.
oThread->Start();
//Thread::Sleep(0);
for ( int i = 0; i < 4; i++ )
{
Console::WriteLine( "Main thread: Do some work." );
Thread::Sleep( 0 );
}
Console::WriteLine( "Main thread: Call Join(), to wait until ThreadProc ends." );
oThread->Join();
Console::WriteLine( "Main thread: ThreadProc.Join has returned. Press Enter to end program." );
Console::ReadLine();
return 0;
}
using System;
using System.Threading;
// Simple threading scenario: Start a static method running
// on a second thread.
public class ThreadExample {
// The ThreadProc method is called when the thread starts.
// It loops ten times, writing to the console and yielding
// the rest of its time slice each time, and then ends.
public static void ThreadProc() {
for (int i = 0; i < 10; i++) {
Console.WriteLine("ThreadProc: {0}", i);
// Yield the rest of the time slice.
Thread.Sleep(0);
}
}
public static void Main() {
Console.WriteLine("Main thread: Start a second thread.");
// The constructor for the Thread class requires a ThreadStart
// delegate that represents the method to be executed on the
// thread. C# simplifies the creation of this delegate.
Thread t = new Thread(new ThreadStart(ThreadProc));
// Start ThreadProc. Note that on a uniprocessor, the new
// thread does not get any processor time until the main thread
// is preempted or yields. Uncomment the Thread.Sleep that
// follows t.Start() to see the difference.
t.Start();
//Thread.Sleep(0);
for (int i = 0; i < 4; i++) {
Console.WriteLine("Main thread: Do some work.");
Thread.Sleep(0);
}
Console.WriteLine("Main thread: Call Join(), to wait until ThreadProc ends.");
t.Join();
Console.WriteLine("Main thread: ThreadProc.Join has returned. Press Enter to end program.");
Console.ReadLine();
}
}
Imports System.Threading
' Simple threading scenario: Start a Shared method running
' on a second thread.
Public Class ThreadExample
' The ThreadProc method is called when the thread starts.
' It loops ten times, writing to the console and yielding
' the rest of its time slice each time, and then ends.
Public Shared Sub ThreadProc()
Dim i As Integer
For i = 0 To 9
Console.WriteLine("ThreadProc: {0}", i)
' Yield the rest of the time slice.
Thread.Sleep(0)
Next
End Sub
Public Shared Sub Main()
Console.WriteLine("Main thread: Start a second thread.")
' The constructor for the Thread class requires a ThreadStart
' delegate. The Visual Basic AddressOf operator creates this
' delegate for you.
Dim t As New Thread(AddressOf ThreadProc)
' Start ThreadProc. Note that on a uniprocessor, the new
' thread does not get any processor time until the main thread
' is preempted or yields. Uncomment the Thread.Sleep that
' follows t.Start() to see the difference.
t.Start()
'Thread.Sleep(0)
Dim i As Integer
For i = 1 To 4
Console.WriteLine("Main thread: Do some work.")
Thread.Sleep(0)
Next
Console.WriteLine("Main thread: Call Join(), to wait until ThreadProc ends.")
t.Join()
Console.WriteLine("Main thread: ThreadProc.Join has returned. Press Enter to end program.")
Console.ReadLine()
End Sub
End Class
Этот код выдает результат, аналогичный приведенному ниже:
[VB, C++, C#]
Main thread: Start a second thread.
Main thread: Do some work.
ThreadProc: 0
Main thread: Do some work.
ThreadProc: 1
Main thread: Do some work.
ThreadProc: 2
Main thread: Do some work.
ThreadProc: 3
Main thread: Call Join(), to wait until ThreadProc ends.
ThreadProc: 4
ThreadProc: 5
ThreadProc: 6
ThreadProc: 7
ThreadProc: 8
ThreadProc: 9
Main thread: ThreadProc.Join has returned. Press Enter to end program.
Комментарии
При запуске процесса среда CLR автоматически создает один передний поток для выполнения кода приложения. Вместе с основным потоком переднего плана процесс может создать один или несколько потоков для выполнения части программного кода, связанного с процессом. Эти потоки могут выполняться как на переднем плане, так и в фоновом режиме. Кроме того, можно использовать ThreadPool класс для выполнения кода в рабочих потоках, управляемых средой CLR.
Содержание раздела
Запуск потока
Получение объектов потока
Передний и фоновый потоки
Культура и потоки
Получение сведений о потоках и управление ими
Запуск потока
Чтобы запустить поток, укажите делегат, представляющий метод, который поток должен выполнить в своем конструкторе класса. Затем вызывается Start метод для начала выполнения.
ThreadКонструкторы могут принимать один из двух типов делегатов в зависимости от того, можно ли передать аргумент в метод для выполнения:
Если метод не имеет аргументов, в конструктор передается ThreadStart делегат. Он имеет подпись:
public delegate void ThreadStart()
Public Delegate Sub ThreadStart()
В следующем примере создается и запускается поток, который выполняет
ExecuteInForeground
метод. Метод отображает сведения о некоторых свойствах потока, затем выполняет цикл, в котором он приостанавливается на половину секунды и отображает прошедшее количество секунд. Когда поток выполнялся по крайней мере в течение пяти секунд, цикл завершается, и поток завершает выполнение.using System; using System.Diagnostics; using System.Threading; public class Example { public static void Main() { var th = new Thread(ExecuteInForeground); th.Start(); Thread.Sleep(1000); Console.WriteLine("Main thread ({0}) exiting...", Thread.CurrentThread.ManagedThreadId); } private static void ExecuteInForeground() { var sw = Stopwatch.StartNew(); Console.WriteLine("Thread {0}: {1}, Priority {2}", Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.ThreadState, Thread.CurrentThread.Priority); do { Console.WriteLine("Thread {0}: Elapsed {1:N2} seconds", Thread.CurrentThread.ManagedThreadId, sw.ElapsedMilliseconds / 1000.0); Thread.Sleep(500); } while (sw.ElapsedMilliseconds <= 5000); sw.Stop(); } } // The example displays output like the following: // Thread 3: Running, Priority Normal // Thread 3: Elapsed 0.00 seconds // Thread 3: Elapsed 0.51 seconds // Main thread (1) exiting... // Thread 3: Elapsed 1.02 seconds // Thread 3: Elapsed 1.53 seconds // Thread 3: Elapsed 2.05 seconds // Thread 3: Elapsed 2.55 seconds // Thread 3: Elapsed 3.07 seconds // Thread 3: Elapsed 3.57 seconds // Thread 3: Elapsed 4.07 seconds // Thread 3: Elapsed 4.58 seconds
Imports System.Diagnostics Imports System.Threading Module Example Public Sub Main() Dim th As New Thread(AddressOf ExecuteInForeground) th.Start() Thread.Sleep(1000) Console.WriteLine("Main thread ({0}) exiting...", Thread.CurrentThread.ManagedThreadId) End Sub Private Sub ExecuteInForeground() Dim start As DateTime = DateTime.Now Dim sw As Stopwatch = Stopwatch.StartNew() Console.WriteLine("Thread {0}: {1}, Priority {2}", Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.ThreadState, Thread.CurrentThread.Priority) Do Console.WriteLine("Thread {0}: Elapsed {1:N2} seconds", Thread.CurrentThread.ManagedThreadId, sw.ElapsedMilliseconds / 1000) Thread.Sleep(500) Loop While sw.ElapsedMilliseconds <= 5000 sw.Stop() End Sub End Module ' The example displays output like the following: ' Thread 3: Running, Priority Normal ' Thread 3: Elapsed 0.00 seconds ' Thread 3: Elapsed 0.51 seconds ' Main thread (1) exiting... ' Thread 3: Elapsed 1.02 seconds ' Thread 3: Elapsed 1.53 seconds ' Thread 3: Elapsed 2.05 seconds ' Thread 3: Elapsed 2.55 seconds ' Thread 3: Elapsed 3.07 seconds ' Thread 3: Elapsed 3.57 seconds ' Thread 3: Elapsed 4.07 seconds ' Thread 3: Elapsed 4.58 seconds
Если метод содержит аргумент, то в конструктор передается ParameterizedThreadStart делегат. Он имеет подпись:
public delegate void ParameterizedThreadStart(object obj)
Public Delegate Sub ParameterizedThreadStart(obj As Object)
затем метод, выполняемый делегатом, может привести (в C#) или преобразовать (в Visual Basic) параметр к соответствующему типу.
Следующий пример идентичен предыдущему, за исключением того, что он вызывает Thread(ParameterizedThreadStart) конструктор. Эта версия
ExecuteInForeground
метода имеет один параметр, представляющий приблизительное количество миллисекунд, которое должен выполнить цикл.using System; using System.Diagnostics; using System.Threading; public class Example { public static void Main() { var th = new Thread(ExecuteInForeground); th.Start(4500); Thread.Sleep(1000); Console.WriteLine("Main thread ({0}) exiting...", Thread.CurrentThread.ManagedThreadId); } private static void ExecuteInForeground(Object obj) { int interval; try { interval = (int) obj; } catch (InvalidCastException) { interval = 5000; } var sw = Stopwatch.StartNew(); Console.WriteLine("Thread {0}: {1}, Priority {2}", Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.ThreadState, Thread.CurrentThread.Priority); do { Console.WriteLine("Thread {0}: Elapsed {1:N2} seconds", Thread.CurrentThread.ManagedThreadId, sw.ElapsedMilliseconds / 1000.0); Thread.Sleep(500); } while (sw.ElapsedMilliseconds <= interval); sw.Stop(); } } // The example displays output like the following: // Thread 3: Running, Priority Normal // Thread 3: Elapsed 0.00 seconds // Thread 3: Elapsed 0.52 seconds // Main thread (1) exiting... // Thread 3: Elapsed 1.03 seconds // Thread 3: Elapsed 1.55 seconds // Thread 3: Elapsed 2.06 seconds // Thread 3: Elapsed 2.58 seconds // Thread 3: Elapsed 3.09 seconds // Thread 3: Elapsed 3.61 seconds // Thread 3: Elapsed 4.12 seconds
Imports System.Diagnostics Imports System.Threading Module Example Public Sub Main() Dim th As New Thread(AddressOf ExecuteInForeground) th.Start(4500) Thread.Sleep(1000) Console.WriteLine("Main thread ({0}) exiting...", Thread.CurrentThread.ManagedThreadId) End Sub Private Sub ExecuteInForeground(obj As Object) Dim interval As Integer If IsNumeric(obj) Then interval = CInt(obj) Else interval = 5000 End If Dim start As DateTime = DateTime.Now Dim sw As Stopwatch = Stopwatch.StartNew() Console.WriteLine("Thread {0}: {1}, Priority {2}", Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.ThreadState, Thread.CurrentThread.Priority) Do Console.WriteLine("Thread {0}: Elapsed {1:N2} seconds", Thread.CurrentThread.ManagedThreadId, sw.ElapsedMilliseconds / 1000) Thread.Sleep(500) Loop While sw.ElapsedMilliseconds <= interval sw.Stop() End Sub End Module ' The example displays output like the following: ' Thread 3: Running, Priority Normal ' Thread 3: Elapsed 0.00 seconds ' Thread 3: Elapsed 0.52 seconds ' Main thread (1) exiting... ' Thread 3: Elapsed 1.03 seconds ' Thread 3: Elapsed 1.55 seconds ' Thread 3: Elapsed 2.06 seconds ' Thread 3: Elapsed 2.58 seconds ' Thread 3: Elapsed 3.09 seconds ' Thread 3: Elapsed 3.61 seconds ' Thread 3: Elapsed 4.12 seconds
Не обязательно хранить ссылку на Thread объект после запуска потока. Поток продолжит выполняться до завершения процедуры потока.
Получение объектов потока
можно использовать статическое Shared
свойство (в Visual Basic) CurrentThread для получения ссылки на текущий выполняющийся поток из кода, выполняемого потоком. В следующем примере свойство используется CurrentThread для вывода сведений о главном потоке приложения, другом основном потоке, фоновом потоке и потоке пула потоков.
using System;
using System.Threading;
public class Example
{
static Object obj = new Object();
public static void Main()
{
ThreadPool.QueueUserWorkItem(ShowThreadInformation);
var th1 = new Thread(ShowThreadInformation);
th1.Start();
var th2 = new Thread(ShowThreadInformation);
th2.IsBackground = true;
th2.Start();
Thread.Sleep(500);
ShowThreadInformation(null);
}
private static void ShowThreadInformation(Object state)
{
lock (obj) {
var th = Thread.CurrentThread;
Console.WriteLine("Managed thread #{0}: ", th.ManagedThreadId);
Console.WriteLine(" Background thread: {0}", th.IsBackground);
Console.WriteLine(" Thread pool thread: {0}", th.IsThreadPoolThread);
Console.WriteLine(" Priority: {0}", th.Priority);
Console.WriteLine(" Culture: {0}", th.CurrentCulture.Name);
Console.WriteLine(" UI culture: {0}", th.CurrentUICulture.Name);
Console.WriteLine();
}
}
}
// The example displays output like the following:
// Managed thread #6:
// Background thread: True
// Thread pool thread: False
// Priority: Normal
// Culture: en-US
// UI culture: en-US
//
// Managed thread #3:
// Background thread: True
// Thread pool thread: True
// Priority: Normal
// Culture: en-US
// UI culture: en-US
//
// Managed thread #4:
// Background thread: False
// Thread pool thread: False
// Priority: Normal
// Culture: en-US
// UI culture: en-US
//
// Managed thread #1:
// Background thread: False
// Thread pool thread: False
// Priority: Normal
// Culture: en-US
// UI culture: en-US
Imports System.Threading
Module Example
Private lock As New Object()
Public Sub Main()
ThreadPool.QueueUserWorkItem(AddressOf ShowThreadInformation)
Dim th1 As New Thread(AddressOf ShowThreadInformation)
th1.Start()
Dim th2 As New Thread(AddressOf ShowThreadInformation)
th2.IsBackground = True
th2.Start()
Thread.Sleep(500)
ShowThreadInformation(Nothing)
End Sub
Private Sub ShowThreadInformation(state As Object)
SyncLock lock
Dim th As Thread = Thread.CurrentThread
Console.WriteLine("Managed thread #{0}: ", th.ManagedThreadId)
Console.WriteLine(" Background thread: {0}", th.IsBackground)
Console.WriteLine(" Thread pool thread: {0}", th.IsThreadPoolThread)
Console.WriteLine(" Priority: {0}", th.Priority)
Console.WriteLine(" Culture: {0}", th.CurrentCulture.Name)
Console.WriteLine(" UI culture: {0}", th.CurrentUICulture.Name)
Console.WriteLine()
End SyncLock
End Sub
End Module
' The example displays output like the following:
' ' Managed thread #6:
' Background thread: True
' Thread pool thread: False
' Priority: Normal
' Culture: en-US
' UI culture: en-US
'
' Managed thread #3:
' Background thread: True
' Thread pool thread: True
' Priority: Normal
' Culture: en-US
' UI culture: en-US
'
' Managed thread #4:
' Background thread: False
' Thread pool thread: False
' Priority: Normal
' Culture: en-US
' UI culture: en-US
'
' Managed thread #1:
' Background thread: False
' Thread pool thread: False
' Priority: Normal
' Culture: en-US
' UI culture: en-US
Основные и фоновые потоки
Экземпляры Thread класса представляют либо потоки переднего плана, либо фоновые потоки. Фоновые потоки идентичны потокам переднего плана с одним исключением: фоновый поток не сохраняет выполнение процесса, если все потоки переднего плана завершаются. После остановки всех активных потоков среда выполнения останавливает все фоновые потоки и завершает работу.
По умолчанию следующие потоки выполняются на переднем плане:
Главный поток приложения.
Все потоки, созданные путем вызова Thread конструктора класса.
Следующие потоки по умолчанию выполняются в фоновом режиме:
Потоки пула потоков, которые являются пулом рабочих потоков, обслуживаемых средой выполнения. Вы можете настроить пул потоков и запланировать работу в потоках пула потоков с помощью ThreadPool класса.
Примечание
Асинхронные операции на основе задач автоматически выполняются в потоках пула потоков. Асинхронные операции на основе задач используют Task Task<TResult> классы и для реализации асинхронной модели на основе задач.
Все потоки, которые вводят управляемую среду выполнения из неуправляемого кода.
Можно изменить поток для выполнения в фоновом режиме, задав IsBackground свойство в любое время. Фоновые потоки полезны для любой операции, которая должна продолжаться при условии, что приложение выполняется, но не должно препятствовать его завершению, например отслеживать изменения файловой системы или входящие подключения через сокет.
В следующем примере показано различие между передним и фоновым потоками. Он похож на первый пример в разделе starting of Thread , за исключением того, что он задает выполнение потока в фоновом режиме перед его запуском. Как видно из выходных данных, цикл прерывается до его выполнения в течение пяти секунд.
using System;
using System.Diagnostics;
using System.Threading;
public class Example
{
public static void Main()
{
var th = new Thread(ExecuteInForeground);
th.IsBackground = true;
th.Start();
Thread.Sleep(1000);
Console.WriteLine("Main thread ({0}) exiting...",
Thread.CurrentThread.ManagedThreadId);
}
private static void ExecuteInForeground()
{
var sw = Stopwatch.StartNew();
Console.WriteLine("Thread {0}: {1}, Priority {2}",
Thread.CurrentThread.ManagedThreadId,
Thread.CurrentThread.ThreadState,
Thread.CurrentThread.Priority);
do {
Console.WriteLine("Thread {0}: Elapsed {1:N2} seconds",
Thread.CurrentThread.ManagedThreadId,
sw.ElapsedMilliseconds / 1000.0);
Thread.Sleep(500);
} while (sw.ElapsedMilliseconds <= 5000);
sw.Stop();
}
}
// The example displays output like the following:
// Thread 3: Background, Priority Normal
// Thread 3: Elapsed 0.00 seconds
// Thread 3: Elapsed 0.51 seconds
// Main thread (1) exiting...
Imports System.Diagnostics
Imports System.Threading
Module Example
Public Sub Main()
Dim th As New Thread(AddressOf ExecuteInForeground)
th.IsBackground = True
th.Start()
Thread.Sleep(1000)
Console.WriteLine("Main thread ({0}) exiting...", Thread.CurrentThread.ManagedThreadId)
End Sub
Private Sub ExecuteInForeground()
Dim start As DateTime = DateTime.Now
Dim sw As Stopwatch = Stopwatch.StartNew()
Console.WriteLine("Thread {0}: {1}, Priority {2}",
Thread.CurrentThread.ManagedThreadId,
Thread.CurrentThread.ThreadState,
Thread.CurrentThread.Priority)
Do
Console.WriteLine("Thread {0}: Elapsed {1:N2} seconds",
Thread.CurrentThread.ManagedThreadId,
sw.ElapsedMilliseconds / 1000)
Thread.Sleep(500)
Loop While sw.ElapsedMilliseconds <= 5000
sw.Stop()
End Sub
End Module
' The example displays output like the following:
' Thread 3: Background, Priority Normal
' Thread 3: Elapsed 0.00 seconds
' Thread 3: Elapsed 0.51 seconds
' Main thread (1) exiting...
Культура и потоки
Каждый поток имеет язык и региональные параметры, представленные CurrentCulture свойством, и язык и региональные параметры пользовательского интерфейса, представленные CurrentUICulture свойством. Текущий язык и региональные параметры поддерживают такие операции с учетом языка и региональных параметров, как синтаксический анализ и форматирование, сравнение строк и сортировка, а также управление системой записи и календарем, используемыми потоком. Текущий язык и региональные параметры пользовательского интерфейса обеспечивают извлечение ресурсов в файлах ресурсов с учетом языка и региональных параметров.
Важно!
CurrentCultureСвойства и CurrentUICulture не работают надежно при использовании в любом потоке, отличном от текущего потока. в платформа .NET Framework чтение этих свойств является надежным, хотя установка этих свойств для потока, отличного от текущего потока, — нет. В .NET Core InvalidOperationException создается исключение, если поток пытается прочитать или записать эти свойства в другом потоке. CultureInfo.CurrentCulture CultureInfo.CurrentUICulture Для получения и задания текущего языка и региональных параметров рекомендуется использовать свойства и.
При создании экземпляра нового потока его язык и региональные параметры и региональные параметры пользовательского интерфейса определяются текущими языковыми параметрами и региональными параметрами пользовательского интерфейса, а не культурой и культурой пользовательского интерфейса потока, из которого создается новый поток. Это означает, например, что если текущий язык и региональные параметры системы имеют английский язык (США), а текущий язык и региональные параметры основного потока приложения — французский (Франция), то язык и региональные параметры нового потока, созданного путем вызова Thread(ParameterizedThreadStart) конструктора из основного потока, — Английский (США), а не французский (Франция). Дополнительные сведения см. в разделе "Культура и потоки" CultureInfo статьи о классе.
Важно!
это не относится к потокам, которые выполняют асинхронные операции для приложений, предназначенных для платформа .NET Framework 4,6 и более поздних версий. в этом случае язык и региональные параметры пользовательского интерфейса являются частью контекста асинхронных операций. поток, в котором асинхронная операция по умолчанию выполняет, наследует язык и региональные параметры пользовательского интерфейса для потока, из которого была запущена асинхронная операция. Дополнительные сведения см. в подразделе "Язык и региональные параметры в асинхронных операциях на основе задач" раздела, посвященного классу CultureInfo.
Можно выполнить одно из следующих действий, чтобы убедиться, что все потоки, выполняющиеся в приложении, совместно используют один и тот же язык и региональные параметры пользовательского интерфейса:
Можно передать CultureInfo объект, представляющий этот язык и региональные параметры, ParameterizedThreadStart делегату или ThreadPool.QueueUserWorkItem(WaitCallback, Object) методу.
для приложений, работающих на платформа .NET Framework 4,5 и более поздних версий, можно определить язык и региональные параметры, которые будут назначены всем потокам, созданным в домене приложения, задав значения CultureInfo.DefaultThreadCurrentCulture CultureInfo.DefaultThreadCurrentUICulture свойств и. Обратите внимание, что это параметр домена для каждого приложения.
Дополнительные сведения и примеры см. в разделе "Культура и потоки" CultureInfo раздела класс.
Получение сведений о потоках и управление ими
Можно получить несколько значений свойств, которые предоставляют сведения о потоке. В некоторых случаях можно также задать значения этих свойств для управления работой потока. Ниже перечислены эти свойства потока.
Имя. Name Свойство однократной записи, которое можно использовать для определения потока. Значение по умолчанию —
null
.Хэш-код, который можно получить, вызвав GetHashCode метод. Хэш-код можно использовать для уникальной идентификации потока; в течение времени существования потока его хэш-код не будет конфликтовать со значением из любого другого потока, независимо от домена приложения, из которого получено значение.
Идентификатор потока. Значение свойства только для чтения ManagedThreadId назначается средой выполнения и уникально идентифицирует поток в своем процессе.
Примечание
ThreadId операционной системы не имеет фиксированного отношения с управляемым потоком, так как неуправляемый узел может управлять отношением между управляемым и неуправляемым потоками. В частности, сложный узел может использовать API размещения CLR для планирования большого количества управляемых потоков в одном потоке операционной системы или для перемещения управляемого потока между различными потоками операционной системы.
Текущее состояние потока. В течение его существования поток всегда находится в одном или нескольких состояниях, определенных ThreadState свойством.
Уровень приоритета планирования, определяемый ThreadPriority свойством. Хотя это значение можно задать для запроса приоритета потока, операционная система не гарантирует его соблюдение.
Свойство только для чтения IsThreadPoolThread , которое указывает, является ли поток потоком пула потоков.
Свойство IsBackground. Дополнительные сведения см. в разделе основной и фоновый потоки .
Конструкторы
Thread(ParameterizedThreadStart) |
Инициализирует новый экземпляр класса Thread, при этом указывается делегат, позволяющий объекту быть переданным в поток при запуске потока. |
Thread(ParameterizedThreadStart, Int32) |
Инициализирует новый экземпляр класса Thread, при этом указывается делегат, позволяющий объекту быть переданным в поток при запуске потока с указанием максимального размера стека для потока. |
Thread(ThreadStart) |
Инициализирует новый экземпляр класса Thread. |
Thread(ThreadStart, Int32) |
Инициализирует новый экземпляр класса Thread, указывая максимальный размер стека для потока. |
Свойства
ApartmentState |
Является устаревшей.
Является устаревшей.
Является устаревшей.
Возвращает или задает модель "apartment" для данного потока. |
CurrentContext |
Возвращает текущий контекст, в котором выполняется поток. |
CurrentCulture |
Получает или задает язык и региональные параметры для текущего потока. |
CurrentPrincipal |
Возвращает или задает текущего участника потока (для безопасности на основе ролей). |
CurrentThread |
Возвращает выполняющийся в данный момент поток. |
CurrentUICulture |
Получает или задает текущие язык и региональные параметры, используемые диспетчером ресурсов для поиска ресурсов, связанных с языком и региональными параметрами, во время выполнения. |
ExecutionContext |
Возвращает объект ExecutionContext, содержащий сведения о различных контекстах текущего потока. |
IsAlive |
Возвращает значение, показывающее статус выполнения текущего потока. |
IsBackground |
Возвращает или задает значение, показывающее, является ли поток фоновым. |
IsThreadPoolThread |
Возвращает значение, показывающее, принадлежит ли поток к группе управляемых потоков. |
ManagedThreadId |
Возвращает уникальный идентификатор текущего управляемого потока. |
Name |
Получает или задает имя потока. |
Priority |
Возвращает или задает значение, указывающее на планируемый приоритет потока. |
ThreadState |
Возвращает значение, содержащее состояния текущего потока. |
Методы
Abort() |
Является устаревшей.
Вызывает исключение ThreadAbortException в вызвавшем его потоке для того, чтобы начать процесс завершения потока. Вызов данного метода обычно завершает поток. |
Abort(Object) |
Является устаревшей.
Вызывает исключение ThreadAbortException в вызвавшем его потоке для того, чтобы начать процесс завершения потока, в то же время предоставляя сведения об исключении касательно исключения завершения потока. Вызов данного метода обычно завершает поток. |
AllocateDataSlot() |
Выделяет неименованную область данных всем потокам. Для улучшения производительности используйте поля, отмеченные атрибутом ThreadStaticAttribute. |
AllocateNamedDataSlot(String) |
Выделяет именованную область данных всем потокам. Для улучшения производительности используйте поля, отмеченные атрибутом ThreadStaticAttribute. |
BeginCriticalRegion() |
Уведомляет узел, что выполнение близится ко входу в область кода, в которой эффекты прерывания выполнения или неуправляемого выполнения могут повлиять на другие задачи в домене приложения. |
BeginThreadAffinity() |
Уведомляет узел, что управляемый код близок к выполнению инструкций, зависящих от идентификации текущего потока операционной системы. |
DisableComObjectEagerCleanup() |
Отключает автоматическую очистку вызываемых оболочек времени выполнения (RCW) для текущего потока. |
EndCriticalRegion() |
Уведомляет узел, что выполнение близится ко входу в область кода, в которой эффекты прерывания выполнения или неуправляемой ошибки ограничены текущей задачей. |
EndThreadAffinity() |
Уведомляет хост об окончании выполнения кодом инструкций, которые зависят от идентификатора текущего потока в операционной системе. |
Equals(Object) |
Определяет, равен ли указанный объект текущему объекту. (Унаследовано от Object) |
Finalize() |
Обеспечивает освобождение ресурсов и выполнение других завершающих операций, когда сборщик мусора восстанавливает объект Thread. |
FreeNamedDataSlot(String) |
Удаляет связь между названием и областью для всех потоков в процессе. Для улучшения производительности используйте поля, отмеченные атрибутом ThreadStaticAttribute. |
GetApartmentState() |
Возвращает значение типа ApartmentState, показывающее состояние апартамента. |
GetCompressedStack() |
Является устаревшей.
Является устаревшей.
Возвращает объект CompressedStack, который может быть использован для записи стека текущего потока. |
GetCurrentProcessorId() |
Возвращает идентификатор, используемый для указания того, какой процессор исполняет текущий поток. |
GetData(LocalDataStoreSlot) |
Извлекает значение из заданной области текущего потока, внутри текущей области текущего потока. Для улучшения производительности используйте поля, отмеченные атрибутом ThreadStaticAttribute. |
GetDomain() |
Возвращает текущую область, в которой выполняется текущий поток. |
GetDomainID() |
Возвращает уникальный идентификатор домена приложения. |
GetHashCode() |
Возвращает хэш-код текущего потока. |
GetHashCode() |
Служит хэш-функцией по умолчанию. (Унаследовано от Object) |
GetNamedDataSlot(String) |
Ищет именованную область данных. Для улучшения производительности используйте поля, отмеченные атрибутом ThreadStaticAttribute. |
GetType() |
Возвращает объект Type для текущего экземпляра. (Унаследовано от Object) |
Interrupt() |
Прерывает работу потока, находящегося в состоянии WaitSleepJoin. |
Join() |
Блокирует вызывающий поток до завершения потока, представленного экземпляром, продолжая отправлять стандартные сообщения COM и |
Join(Int32) |
Блокирует вызывающий поток до завершения потока, представленного экземпляром, или истечения указанного времени, продолжая отправлять стандартные сообщения COM и SendMessage. |
Join(TimeSpan) |
Блокирует вызывающий поток до завершения потока, представленного экземпляром, или истечения указанного времени, продолжая отправлять стандартные сообщения COM и SendMessage. |
MemberwiseClone() |
Создает неполную копию текущего объекта Object. (Унаследовано от Object) |
MemoryBarrier() |
Синхронизирует доступ к памяти следующим образом: процессор, выполняющий текущий поток, не способен упорядочить инструкции так, чтобы обращения к памяти до вызова метода MemoryBarrier() выполнялись после обращений к памяти, следующих за вызовом метода MemoryBarrier(). |
ResetAbort() |
Является устаревшей.
Отменяет метод Abort(Object), запрошенный для текущего потока. |
Resume() |
Является устаревшей.
Является устаревшей.
Является устаревшей.
Возобновляет приостановленную работу потока. |
SetApartmentState(ApartmentState) |
Задает модель "apartment" для потока до его запуска. |
SetCompressedStack(CompressedStack) |
Является устаревшей.
Является устаревшей.
Применяет записанное значение CompressedStack к текущему потоку. |
SetData(LocalDataStoreSlot, Object) |
Задает данные в указанной области для текущей области потока, выполняющегося в данный момент. Для улучшения производительности используйте поля, отмеченные атрибутом ThreadStaticAttribute. |
Sleep(Int32) |
Приостанавливает текущий поток на заданное количество миллисекунд. |
Sleep(TimeSpan) |
Приостанавливает текущий поток на заданное время. |
SpinWait(Int32) |
Вынуждает поток выполнять ожидание столько раз, сколько определено параметром |
Start() |
Вынуждает операционную систему изменить состояние текущего экземпляра на Running. |
Start(Object) |
Заставляет операционную систему изменить состояние текущего экземпляра на Running, а также (необязательно) передает объект с данными, используемыми методом в потоке. |
Suspend() |
Является устаревшей.
Является устаревшей.
Является устаревшей.
Приостанавливает работу потока; если работа потока уже приостановлена, не оказывает влияния. |
ToString() |
Возвращает строку, представляющую текущий объект. (Унаследовано от Object) |
TrySetApartmentState(ApartmentState) |
Задает модель "apartment" для потока до его запуска. |
UnsafeStart() |
Вынуждает операционную систему изменить состояние текущего экземпляра на Running. |
UnsafeStart(Object) |
Заставляет операционную систему изменить состояние текущего экземпляра на Running, а также (необязательно) передает объект с данными, используемыми методом в потоке. |
VolatileRead(Byte) |
Считывает значение поля. В системах, которым это необходимо, вставляет барьер памяти, не позволяющий процессору изменять порядок операций памяти следующим образом: если операция чтения или записи появляется после данного метода в коде, процессор не сможет переместить ее перед этим методом. |
VolatileRead(Double) |
Считывает значение поля. В системах, которым это необходимо, вставляет барьер памяти, не позволяющий процессору изменять порядок операций памяти следующим образом: если операция чтения или записи появляется после данного метода в коде, процессор не сможет переместить ее перед этим методом. |
VolatileRead(Int16) |
Считывает значение поля. В системах, которым это необходимо, вставляет барьер памяти, не позволяющий процессору изменять порядок операций памяти следующим образом: если операция чтения или записи появляется после данного метода в коде, процессор не сможет переместить ее перед этим методом. |
VolatileRead(Int32) |
Считывает значение поля. В системах, которым это необходимо, вставляет барьер памяти, не позволяющий процессору изменять порядок операций памяти следующим образом: если операция чтения или записи появляется после данного метода в коде, процессор не сможет переместить ее перед этим методом. |
VolatileRead(Int64) |
Считывает значение поля. В системах, которым это необходимо, вставляет барьер памяти, не позволяющий процессору изменять порядок операций памяти следующим образом: если операция чтения или записи появляется после данного метода в коде, процессор не сможет переместить ее перед этим методом. |
VolatileRead(IntPtr) |
Считывает значение поля. В системах, которым это необходимо, вставляет барьер памяти, не позволяющий процессору изменять порядок операций памяти следующим образом: если операция чтения или записи появляется после данного метода в коде, процессор не сможет переместить ее перед этим методом. |
VolatileRead(Object) |
Считывает значение поля. В системах, которым это необходимо, вставляет барьер памяти, не позволяющий процессору изменять порядок операций памяти следующим образом: если операция чтения или записи появляется после данного метода в коде, процессор не сможет переместить ее перед этим методом. |
VolatileRead(SByte) |
Считывает значение поля. В системах, которым это необходимо, вставляет барьер памяти, не позволяющий процессору изменять порядок операций памяти следующим образом: если операция чтения или записи появляется после данного метода в коде, процессор не сможет переместить ее перед этим методом. |
VolatileRead(Single) |
Считывает значение поля. В системах, которым это необходимо, вставляет барьер памяти, не позволяющий процессору изменять порядок операций памяти следующим образом: если операция чтения или записи появляется после данного метода в коде, процессор не сможет переместить ее перед этим методом. |
VolatileRead(UInt16) |
Считывает значение поля. В системах, которым это необходимо, вставляет барьер памяти, не позволяющий процессору изменять порядок операций памяти следующим образом: если операция чтения или записи появляется после данного метода в коде, процессор не сможет переместить ее перед этим методом. |
VolatileRead(UInt32) |
Считывает значение поля. В системах, которым это необходимо, вставляет барьер памяти, не позволяющий процессору изменять порядок операций памяти следующим образом: если операция чтения или записи появляется после данного метода в коде, процессор не сможет переместить ее перед этим методом. |
VolatileRead(UInt64) |
Считывает значение поля. В системах, которым это необходимо, вставляет барьер памяти, не позволяющий процессору изменять порядок операций памяти следующим образом: если операция чтения или записи появляется после данного метода в коде, процессор не сможет переместить ее перед этим методом. |
VolatileRead(UIntPtr) |
Считывает значение поля. В системах, которым это необходимо, вставляет барьер памяти, не позволяющий процессору изменять порядок операций памяти следующим образом: если операция чтения или записи появляется после данного метода в коде, процессор не сможет переместить ее перед этим методом. |
VolatileWrite(Byte, Byte) |
Записывает значение в поле. В системах, которым это необходимо, вставляет барьер памяти, не позволяющий процессору изменять порядок операций памяти следующим образом: если операция чтения или записи появляется перед данным методом в коде, процессор не сможет поместить ее после этого метода. |
VolatileWrite(Double, Double) |
Записывает значение в поле. В системах, которым это необходимо, вставляет барьер памяти, не позволяющий процессору изменять порядок операций памяти следующим образом: если операция чтения или записи появляется перед данным методом в коде, процессор не сможет поместить ее после этого метода. |
VolatileWrite(Int16, Int16) |
Записывает значение в поле. В системах, которым это необходимо, вставляет барьер памяти, не позволяющий процессору изменять порядок операций памяти следующим образом: если операция чтения или записи появляется перед данным методом в коде, процессор не сможет поместить ее после этого метода. |
VolatileWrite(Int32, Int32) |
Записывает значение в поле. В системах, которым это необходимо, вставляет барьер памяти, не позволяющий процессору изменять порядок операций памяти следующим образом: если операция чтения или записи появляется перед данным методом в коде, процессор не сможет поместить ее после этого метода. |
VolatileWrite(Int64, Int64) |
Записывает значение в поле. В системах, которым это необходимо, вставляет барьер памяти, не позволяющий процессору изменять порядок операций памяти следующим образом: если операция чтения или записи появляется перед данным методом в коде, процессор не сможет поместить ее после этого метода. |
VolatileWrite(IntPtr, IntPtr) |
Записывает значение в поле. В системах, которым это необходимо, вставляет барьер памяти, не позволяющий процессору изменять порядок операций памяти следующим образом: если операция чтения или записи появляется перед данным методом в коде, процессор не сможет поместить ее после этого метода. |
VolatileWrite(Object, Object) |
Записывает значение в поле. В системах, которым это необходимо, вставляет барьер памяти, не позволяющий процессору изменять порядок операций памяти следующим образом: если операция чтения или записи появляется перед данным методом в коде, процессор не сможет поместить ее после этого метода. |
VolatileWrite(SByte, SByte) |
Записывает значение в поле. В системах, которым это необходимо, вставляет барьер памяти, не позволяющий процессору изменять порядок операций памяти следующим образом: если операция чтения или записи появляется перед данным методом в коде, процессор не сможет поместить ее после этого метода. |
VolatileWrite(Single, Single) |
Записывает значение в поле. В системах, которым это необходимо, вставляет барьер памяти, не позволяющий процессору изменять порядок операций памяти следующим образом: если операция чтения или записи появляется перед данным методом в коде, процессор не сможет поместить ее после этого метода. |
VolatileWrite(UInt16, UInt16) |
Записывает значение в поле. В системах, которым это необходимо, вставляет барьер памяти, не позволяющий процессору изменять порядок операций памяти следующим образом: если операция чтения или записи появляется перед данным методом в коде, процессор не сможет поместить ее после этого метода. |
VolatileWrite(UInt32, UInt32) |
Записывает значение в поле. В системах, которым это необходимо, вставляет барьер памяти, не позволяющий процессору изменять порядок операций памяти следующим образом: если операция чтения или записи появляется перед данным методом в коде, процессор не сможет поместить ее после этого метода. |
VolatileWrite(UInt64, UInt64) |
Записывает значение в поле. В системах, которым это необходимо, вставляет барьер памяти, не позволяющий процессору изменять порядок операций памяти следующим образом: если операция чтения или записи появляется перед данным методом в коде, процессор не сможет поместить ее после этого метода. |
VolatileWrite(UIntPtr, UIntPtr) |
Записывает значение в поле. В системах, которым это необходимо, вставляет барьер памяти, не позволяющий процессору изменять порядок операций памяти следующим образом: если операция чтения или записи появляется перед данным методом в коде, процессор не сможет поместить ее после этого метода. |
Yield() |
Позволяет вызвавшему потоку передать выполнение другому потоку, готовому к использованию на текущем процессоре. Операционная система выбирает, какому потоку передается выполнение. |
Явные реализации интерфейса
_Thread.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr) |
Сопоставляет набор имен соответствующему набору идентификаторов диспетчеризации. |
_Thread.GetTypeInfo(UInt32, UInt32, IntPtr) |
Возвращает сведения о типе объекта, которые затем могут использоваться для получения сведений о типе интерфейса. |
_Thread.GetTypeInfoCount(UInt32) |
Возвращает количество предоставляемых объектом интерфейсов для доступа к сведениям о типе (0 или 1). |
_Thread.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr) |
Предоставляет доступ к открытым свойствам и методам объекта. |
Применяется к
Потокобезопасность
Данный тип потокобезопасен.