WaitHandle Класс
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Инкапсулирует объекты, относящиеся к операционной системе, которые ожидают монопольного доступа к общим ресурсам.
public ref class WaitHandle abstract : IDisposable
public ref class WaitHandle abstract : MarshalByRefObject, IDisposable
public abstract class WaitHandle : IDisposable
public abstract class WaitHandle : MarshalByRefObject, IDisposable
[System.Runtime.InteropServices.ComVisible(true)]
public abstract class WaitHandle : MarshalByRefObject, IDisposable
type WaitHandle = class
interface IDisposable
type WaitHandle = class
inherit MarshalByRefObject
interface IDisposable
[<System.Runtime.InteropServices.ComVisible(true)>]
type WaitHandle = class
inherit MarshalByRefObject
interface IDisposable
Public MustInherit Class WaitHandle
Implements IDisposable
Public MustInherit Class WaitHandle
Inherits MarshalByRefObject
Implements IDisposable
- Наследование
-
WaitHandle
- Наследование
- Производный
- Атрибуты
- Реализации
Примеры
В следующем примере кода показано, как два потока могут выполнять фоновые задачи, пока основной поток ожидает завершения задач с помощью статических WaitAnyWaitHandle и WaitAll методов класса.
using System;
using System.Threading;
public sealed class App
{
// Define an array with two AutoResetEvent WaitHandles.
static WaitHandle[] waitHandles = new WaitHandle[]
{
new AutoResetEvent(false),
new AutoResetEvent(false)
};
// Define a random number generator for testing.
static Random r = new Random();
static void Main()
{
// Queue up two tasks on two different threads;
// wait until all tasks are completed.
DateTime dt = DateTime.Now;
Console.WriteLine("Main thread is waiting for BOTH tasks to complete.");
ThreadPool.QueueUserWorkItem(new WaitCallback(DoTask), waitHandles[0]);
ThreadPool.QueueUserWorkItem(new WaitCallback(DoTask), waitHandles[1]);
WaitHandle.WaitAll(waitHandles);
// The time shown below should match the longest task.
Console.WriteLine("Both tasks are completed (time waited={0})",
(DateTime.Now - dt).TotalMilliseconds);
// Queue up two tasks on two different threads;
// wait until any task is completed.
dt = DateTime.Now;
Console.WriteLine();
Console.WriteLine("The main thread is waiting for either task to complete.");
ThreadPool.QueueUserWorkItem(new WaitCallback(DoTask), waitHandles[0]);
ThreadPool.QueueUserWorkItem(new WaitCallback(DoTask), waitHandles[1]);
int index = WaitHandle.WaitAny(waitHandles);
// The time shown below should match the shortest task.
Console.WriteLine("Task {0} finished first (time waited={1}).",
index + 1, (DateTime.Now - dt).TotalMilliseconds);
}
static void DoTask(Object state)
{
AutoResetEvent are = (AutoResetEvent) state;
int time = 1000 * r.Next(2, 10);
Console.WriteLine("Performing a task for {0} milliseconds.", time);
Thread.Sleep(time);
are.Set();
}
}
// This code produces output similar to the following:
//
// Main thread is waiting for BOTH tasks to complete.
// Performing a task for 7000 milliseconds.
// Performing a task for 4000 milliseconds.
// Both tasks are completed (time waited=7064.8052)
//
// The main thread is waiting for either task to complete.
// Performing a task for 2000 milliseconds.
// Performing a task for 2000 milliseconds.
// Task 1 finished first (time waited=2000.6528).
Imports System.Threading
NotInheritable Public Class App
' Define an array with two AutoResetEvent WaitHandles.
Private Shared waitHandles() As WaitHandle = _
{New AutoResetEvent(False), New AutoResetEvent(False)}
' Define a random number generator for testing.
Private Shared r As New Random()
<MTAThreadAttribute> _
Public Shared Sub Main()
' Queue two tasks on two different threads;
' wait until all tasks are completed.
Dim dt As DateTime = DateTime.Now
Console.WriteLine("Main thread is waiting for BOTH tasks to complete.")
ThreadPool.QueueUserWorkItem(AddressOf DoTask, waitHandles(0))
ThreadPool.QueueUserWorkItem(AddressOf DoTask, waitHandles(1))
WaitHandle.WaitAll(waitHandles)
' The time shown below should match the longest task.
Console.WriteLine("Both tasks are completed (time waited={0})", _
(DateTime.Now - dt).TotalMilliseconds)
' Queue up two tasks on two different threads;
' wait until any tasks are completed.
dt = DateTime.Now
Console.WriteLine()
Console.WriteLine("The main thread is waiting for either task to complete.")
ThreadPool.QueueUserWorkItem(AddressOf DoTask, waitHandles(0))
ThreadPool.QueueUserWorkItem(AddressOf DoTask, waitHandles(1))
Dim index As Integer = WaitHandle.WaitAny(waitHandles)
' The time shown below should match the shortest task.
Console.WriteLine("Task {0} finished first (time waited={1}).", _
index + 1,(DateTime.Now - dt).TotalMilliseconds)
End Sub
Shared Sub DoTask(ByVal state As [Object])
Dim are As AutoResetEvent = CType(state, AutoResetEvent)
Dim time As Integer = 1000 * r.Next(2, 10)
Console.WriteLine("Performing a task for {0} milliseconds.", time)
Thread.Sleep(time)
are.Set()
End Sub
End Class
' This code produces output similar to the following:
'
' Main thread is waiting for BOTH tasks to complete.
' Performing a task for 7000 milliseconds.
' Performing a task for 4000 milliseconds.
' Both tasks are completed (time waited=7064.8052)
'
' The main thread is waiting for either task to complete.
' Performing a task for 2000 milliseconds.
' Performing a task for 2000 milliseconds.
' Task 1 finished first (time waited=2000.6528).
Комментарии
Класс WaitHandle инкапсулирует собственный дескриптор синхронизации операционной системы и используется для представления всех объектов синхронизации в среде выполнения, разрешающих несколько операций ожидания. Сравнение дескрипторов ожидания с другими объектами синхронизации см. в разделе "Обзор примитивов синхронизации".
Сам WaitHandle класс является абстрактным. Классы, производные от WaitHandle определения механизма сигнала, указывающие на принятие или освобождение доступа к общему ресурсу, но используют унаследованные WaitHandle методы для блокировки при ожидании доступа к общим ресурсам. Классы, производные от WaitHandle следующих:
Класс и его производные EventWaitHandle классы и ManualResetEventAutoResetEvent .
Класс Semaphore. См. Семафор и СемафорSlim.
Потоки могут блокировать отдельный дескриптор ожидания путем вызова метода WaitOneэкземпляра, который наследуется классами, производными от WaitHandle.
Производные WaitHandle классы отличаются в их сходстве потоков. Дескриптор ожидания событий (EventWaitHandle, AutoResetEventи) и ManualResetEventсемафоры не имеют сходства потоков; любой поток может сигнализировать дескриптор ожидания события или семафор. Мьютексы, с другой стороны, имеют сходство потоков; Поток, принадлежащий мьютексу, должен освободить его, и исключение создается, если поток вызывает ReleaseMutex метод в мьютексе, который он не владеет.
WaitHandle Так как класс является производным от MarshalByRefObjectэтого, эти классы можно использовать для синхронизации действий потоков между границами домена приложения.
Помимо производных классов, класс имеет ряд статических методов, WaitHandle которые блокируют поток, пока один или несколько объектов синхронизации не получат сигнал. К ним относятся:
SignalAndWait, который позволяет потоку сигнализировать один дескриптор ожидания и немедленно ждать на другом.
WaitAll, который позволяет потоку ждать, пока все дескриптор ожидания в массиве получают сигнал.
WaitAny, который позволяет потоку ждать, пока любой из указанного набора дескрипторов ожидания будет сигнализировать.
Перегрузки этих методов предоставляют интервалы времени ожидания для отказа от ожидания и возможность выхода из контекста синхронизации перед вводом ожидания, позволяя другим потокам использовать контекст синхронизации.
Это важно
Этот тип реализует IDisposable интерфейс. Завершив использование типа или типа, производного от него, его следует удалить напрямую или косвенно. Чтобы удалить тип напрямую, вызовите его Close метод в блоке try/catch . Чтобы удалить его косвенно, используйте конструкцию языка, например using (в C#) или Using (в Visual Basic). Дополнительные сведения см. в разделе "Использование объекта, реализующего IDisposable" в IDisposable разделе интерфейса.
WaitHandle Dispose реализует шаблон. См. раздел "Реализация метода Dispose". Если вы наследуетеSafeWaitHandle, WaitHandleиспользуйте свойство для хранения собственного дескриптора операционной системы. Вам не нужно переопределять защищенный метод, если вы не используете дополнительные неуправляемые Dispose ресурсы.
Конструкторы
| Имя | Описание |
|---|---|
| WaitHandle() |
Инициализирует новый экземпляр класса WaitHandle. |
Поля
| Имя | Описание |
|---|---|
| InvalidHandle |
Представляет недопустимый дескриптор собственной операционной системы. Это поле доступно только для чтения. |
| WaitTimeout |
Указывает, что операция истекла до того, WaitAny(WaitHandle[], Int32, Boolean) как любой из дескрипторов ожидания был сигналирован. Это поле является константой. |
Свойства
| Имя | Описание |
|---|---|
| Handle |
Устаревшие..
Устаревшие..
Возвращает или задает дескриптор собственной операционной системы. |
| SafeWaitHandle |
Возвращает или задает дескриптор собственной операционной системы. |
Методы
| Имя | Описание |
|---|---|
| Close() |
Освобождает все ресурсы, удерживаемые текущим WaitHandle. |
| CreateObjRef(Type) |
Создает объект, содержащий все соответствующие сведения, необходимые для создания прокси-сервера, используемого для взаимодействия с удаленным объектом. (Унаследовано от MarshalByRefObject) |
| Dispose() |
Освобождает все ресурсы, используемые текущим экземпляром класса WaitHandle. |
| Dispose(Boolean) |
При переопределении в производном классе освобождает неуправляемые ресурсы, используемые и WaitHandleпри необходимости освобождает управляемые ресурсы. |
| Equals(Object) |
Определяет, равен ли указанный объект текущему объекту. (Унаследовано от Object) |
| Finalize() |
Освобождает ресурсы, удерживаемые текущим экземпляром. |
| GetHashCode() |
Служит хэш-функцией по умолчанию. (Унаследовано от Object) |
| GetLifetimeService() |
Устаревшие..
Извлекает текущий объект службы времени существования, который управляет политикой времени существования для этого экземпляра. (Унаследовано от MarshalByRefObject) |
| GetType() |
Возвращает Type текущего экземпляра. (Унаследовано от Object) |
| InitializeLifetimeService() |
Устаревшие..
Получает объект службы времени существования для управления политикой времени существования для этого экземпляра. (Унаследовано от MarshalByRefObject) |
| MemberwiseClone() |
Создает неглубокую копию текущей Object. (Унаследовано от Object) |
| MemberwiseClone(Boolean) |
Создает неглубокую копию текущего MarshalByRefObject объекта. (Унаследовано от MarshalByRefObject) |
| SignalAndWait(WaitHandle, WaitHandle, Int32, Boolean) |
Сигнализирует одному WaitHandle и ожидает другого, указывая интервал времени ожидания в виде 32-разрядного целого числа со знаком и указывая, следует ли выйти из домена синхронизации для контекста перед вводом ожидания. |
| SignalAndWait(WaitHandle, WaitHandle, TimeSpan, Boolean) |
Сигнализирует одному WaitHandle и ожидает другого, указывая интервал времени ожидания в качестве TimeSpan интервала ожидания и указывая, следует ли выйти из домена синхронизации для контекста перед вводом ожидания. |
| SignalAndWait(WaitHandle, WaitHandle) |
Сигнализирует одному WaitHandle и ожидает другого. |
| ToString() |
Возвращает строку, представляющую текущий объект. (Унаследовано от Object) |
| WaitAll(WaitHandle[], Int32, Boolean) |
Ожидает, чтобы все элементы в указанном массиве получали сигнал, используя Int32 значение, чтобы указать интервал времени и указать, следует ли выйти из домена синхронизации перед ожиданием. |
| WaitAll(WaitHandle[], Int32) |
Ожидает, чтобы все элементы в указанном массиве получали сигнал, используя Int32 значение для указания интервала времени. |
| WaitAll(WaitHandle[], TimeSpan, Boolean) |
Ожидает, чтобы все элементы в указанном массиве получали сигнал, используя TimeSpan значение для указания интервала времени и указывая, следует ли выйти из домена синхронизации перед ожиданием. |
| WaitAll(WaitHandle[], TimeSpan) |
Ожидает, чтобы все элементы в указанном массиве получали сигнал, используя TimeSpan значение для указания интервала времени. |
| WaitAll(WaitHandle[]) |
Ожидает получения сигнала для всех элементов в указанном массиве. |
| WaitAny(WaitHandle[], Int32, Boolean) |
Ожидает, пока любой из элементов в указанном массиве получит сигнал, используя 32-разрядное целое число со знаком, чтобы указать интервал времени и указать, следует ли выйти из домена синхронизации перед ожиданием. |
| WaitAny(WaitHandle[], Int32) |
Ожидает, чтобы любой из элементов в указанном массиве получил сигнал, используя 32-разрядное целое число со знаком, чтобы указать интервал времени. |
| WaitAny(WaitHandle[], TimeSpan, Boolean) |
Ожидает, чтобы любой из элементов в указанном массиве получил сигнал, используя TimeSpan интервал времени и указывая, следует ли выйти из домена синхронизации перед ожиданием. |
| WaitAny(WaitHandle[], TimeSpan) |
Ожидает, пока любой из элементов в указанном массиве получит сигнал, используя TimeSpan интервал времени. |
| WaitAny(WaitHandle[]) |
Ожидает получения сигнала любого из элементов в указанном массиве. |
| WaitOne() |
Блокирует текущий поток, пока текущий WaitHandle не получит сигнал. |
| WaitOne(Int32, Boolean) |
Блокирует текущий поток, пока текущий WaitHandle не получит сигнал, используя 32-разрядное целое число со знаком, чтобы указать интервал времени и указать, следует ли выйти из домена синхронизации перед ожиданием. |
| WaitOne(Int32) |
Блокирует текущий поток, пока текущий WaitHandle не получит сигнал, используя 32-разрядное целое число со знаком, чтобы указать интервал времени в миллисекундах. |
| WaitOne(TimeSpan, Boolean) |
Блокирует текущий поток, пока текущий экземпляр не получит сигнал, используя TimeSpan интервал времени и указав, следует ли выйти из домена синхронизации перед ожиданием. |
| WaitOne(TimeSpan) |
Блокирует текущий поток, пока текущий экземпляр не получит сигнал, используя TimeSpan интервал времени. |
Явные реализации интерфейса
| Имя | Описание |
|---|---|
| IDisposable.Dispose() |
Этот API поддерживает инфраструктуру продукта и не предназначен для использования непосредственно из программного кода. Освобождает все ресурсы, используемые параметром WaitHandle. |
Методы расширения
| Имя | Описание |
|---|---|
| GetSafeWaitHandle(WaitHandle) |
Возвращает безопасный дескриптор для собственного дескриптора ожидания операционной системы. |
| SetSafeWaitHandle(WaitHandle, SafeWaitHandle) |
Задает безопасный дескриптор для собственного дескриптора ожидания операционной системы. |
Применяется к
Потокобезопасность
Этот тип является потокобезопасной.