Использование потоков и работа с потоками

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

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

Примечание.

Если требуется больший контроль над поведением потоков приложения, можно управлять потоками самостоятельно. Однако многопоточное программирование значительно упрощено с System.Threading.Tasks.ParallelSystem.Threading.Tasks.Task помощью классов и классов Parallel LINQ (PLINQ), параллельных классов коллекций в System.Collections.Concurrent пространстве имен и модели программирования, основанной на концепции задач, а не потоков. Дополнительные сведения см. в статье Параллельное программирование в .NET и Библиотека параллельных задач (TPL).

Практическое руководство. Создание и запуск нового потока

Создав новый поток, создав новый экземпляр System.Threading.Thread класса. Укажите имя метода, который требуется выполнить в новом потоке конструктору. Чтобы запустить созданный поток, вызовите метод Thread.Start. Дополнительные сведения и примеры см. в статье Создание потоков и передача данных во время запуска и справочнике по API Thread.

Практическое руководство. Остановка потока

Чтобы прервать выполнение потока, используйте метод System.Threading.CancellationToken. Это единый способ совместной отмены потоков. Подробные сведения см. в статье Отмена в управляемых потоках.

Иногда невозможно остановить поток совместно, так как он запускает сторонний код, не предназначенный для совместной отмены. В этом случае вы можете выполнить принудительное завершение. Чтобы принудительно завершить выполнение потока, воспользуйтесь методом Thread.Abort в .NET Framework. Этот метод вызывает ThreadAbortException в потоке, для которого был вызван. Дополнительные сведения см. в разделе Уничтожение потоков. Метод Thread.Abort не поддерживается в .NET Core. Если необходимо завершить выполнение стороннего кода принудительно в .NET Core, запустите его в отдельном процессе и используйте Process.Kill метод.

Он System.Threading.CancellationToken недоступен до платформа .NET Framework 4. Чтобы остановить поток в более ранних версиях платформа .NET Framework, используйте методы синхронизации потоков для реализации совместной отмены вручную. Например, вы можете создать изменяемое логическое поле shouldStop и использовать его для запроса остановки кода, выполняемого потоком. Дополнительные сведения см. в справочнике по C# и в этой статье: System.Threading.Volatile.

Используйте метод Thread.Join, чтобы вызывающий поток ждал завершения останавливаемого потока.

Практическое руководство. Приостановка или прерывание потока

Используйте метод Thread.Sleep, чтобы приостановить текущий поток на определенное время. Заблокированный поток можно прервать путем вызова метода Thread.Interrupt. Дополнительные сведения см. в разделе Приостановка и прерывание потоков.

Свойства потока

В приведенной ниже таблице показаны некоторые свойства Thread.

Свойство Description
IsAlive Возвращает, true если поток был запущен и еще не завершился нормально или прерван.
IsBackground Возвращает или задает логическое значение, которое указывает, является ли поток фоновым потоком. Фоновые потоки похожи на потоки переднего плана. Однако фоновый поток не предотвращает остановку процесса. Когда обработка всех основных потоков закончена, общеязыковая среда выполнения завершает процесс, применяя метод Abort к тем фоновым потокам, которые еще продолжают существовать. См. дополнительные сведения об основных и фоновых потоках.
Name Возвращает или задает имя потока. Наиболее часто используется для обнаружения отдельных потоков при отладке.
Priority Возвращает или задает ThreadPriority значение, используемое операционной системой для определения приоритета планирования потоков. Дополнительные сведения см. в разделе Планирование потоков и в справочнике по ThreadPriority.
ThreadState Возвращает значение ThreadState, содержащее текущие состояния потока.

См. также