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


Использование потоков (Руководство по программированию на C#)

Обновлен: Ноябрь 2007

По умолчанию программа на языке C# имеет один поток. Этот поток выполняет код при запуске и завершении программы с помощью метода Main. Каждая команда, выполняемая с помощью метода Main — прямо или косвенно — выполняется по умолчанию или посредством основного потока, и этот поток прекращает работу после возврата Main. Однако параллельно основному потоку могут создаваться и использоваться вспомогательные потоки. Эти потоки часто называются рабочими потоками.

Рабочие потоки могут использоваться для выполнения трудоемких или срочных задач без прерывания основного потока. Например, рабочие потоки часто используются в серверных приложениях для выполнения входящих запросов, не дожидаясь завершения выполнения предыдущего запроса. Рабочие потоки также используются для выполнения "фоновых" задач в настольных приложениях, что позволяет основному потоку (который отвечает за элементы пользовательского интерфейса) оставаться доступным для команд пользователя.

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

Обычно рабочие потоки используются для выполнения трудоемких или срочных задач, для которых не требуется большое количество ресурсов, используемых другими потоками. Естественно, некоторые используемые программой ресурсы должны быть доступны для нескольких потоков. В этих случаях пространство имен System.Threading предоставляет классы для синхронизации потоков. Эти классы включают Mutex, Monitor, Interlocked, AutoResetEvent и ManualResetEvent.

Можно использовать некоторые или все эти классы для синхронизации работы нескольких потоков, но некоторые многопоточные функции поддерживаются языком C#. Например, оператор Lock языка C# обеспечивает синхронизацию за счет неявного использования класса Monitor.

Средства многопоточной работы описаны в следующих разделах:

Связанные разделы

Дополнительные сведения см. в следующих разделах:

См. также

Задачи

Пример Monitor Synchronization Technology

Пример Wait Synchronization Technology

Пример работы с потоками

Основные понятия

Руководство по программированию в C#

Мониторы

Блокируемые операции

AutoResetEvent

Ссылки

Thread

Mutex

Другие ресурсы

Управляемая поточность

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

Примеры работы потоков