ManualResetEvent Класс

Определение

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

public ref class ManualResetEvent sealed : System::Threading::EventWaitHandle
public ref class ManualResetEvent sealed : System::Threading::WaitHandle
public sealed class ManualResetEvent : System.Threading.EventWaitHandle
public sealed class ManualResetEvent : System.Threading.WaitHandle
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class ManualResetEvent : System.Threading.EventWaitHandle
type ManualResetEvent = class
    inherit EventWaitHandle
type ManualResetEvent = class
    inherit WaitHandle
[<System.Runtime.InteropServices.ComVisible(true)>]
type ManualResetEvent = class
    inherit EventWaitHandle
Public NotInheritable Class ManualResetEvent
Inherits EventWaitHandle
Public NotInheritable Class ManualResetEvent
Inherits WaitHandle
Наследование
ManualResetEvent
Наследование
Наследование
Атрибуты

Примеры

В следующем примере показано, как ManualResetEvent работает. Пример начинается с ManualResetEvent состояния без знака (т false . е. передается конструктору). В примере создаются три потока, каждый из которых блокируется ManualResetEvent путем вызова метода WaitOne . Когда пользователь нажимает клавишу ВВОД , в примере вызывается Set метод, который освобождает все три потока. Сравните это с поведением AutoResetEvent класса, который освобождает потоки по одному за раз, сбрасывая автоматически после каждого выпуска.

При нажатии клавиши ВВОД снова показано, что ManualResetEvent останки в сигнальном состоянии, пока его Reset метод не будет вызван: пример запускает еще два потока. Эти потоки не блокируются при вызове WaitOne метода, а вместо этого выполняются до завершения.

При повторном нажатии клавиши ВВОД пример вызывает Reset метод и запускает еще один поток, который блокируется при вызове WaitOne. Чтобы освободить последний поток, нажмите клавишу ВВОД , Set и программа заканчивается.

using System;
using System.Threading;

public class Example
{
    // mre is used to block and release threads manually. It is
    // created in the unsignaled state.
    private static ManualResetEvent mre = new ManualResetEvent(false);

    static void Main()
    {
        Console.WriteLine("\nStart 3 named threads that block on a ManualResetEvent:\n");

        for(int i = 0; i <= 2; i++)
        {
            Thread t = new Thread(ThreadProc);
            t.Name = "Thread_" + i;
            t.Start();
        }

        Thread.Sleep(500);
        Console.WriteLine("\nWhen all three threads have started, press Enter to call Set()" +
                          "\nto release all the threads.\n");
        Console.ReadLine();

        mre.Set();

        Thread.Sleep(500);
        Console.WriteLine("\nWhen a ManualResetEvent is signaled, threads that call WaitOne()" +
                          "\ndo not block. Press Enter to show this.\n");
        Console.ReadLine();

        for(int i = 3; i <= 4; i++)
        {
            Thread t = new Thread(ThreadProc);
            t.Name = "Thread_" + i;
            t.Start();
        }

        Thread.Sleep(500);
        Console.WriteLine("\nPress Enter to call Reset(), so that threads once again block" +
                          "\nwhen they call WaitOne().\n");
        Console.ReadLine();

        mre.Reset();

        // Start a thread that waits on the ManualResetEvent.
        Thread t5 = new Thread(ThreadProc);
        t5.Name = "Thread_5";
        t5.Start();

        Thread.Sleep(500);
        Console.WriteLine("\nPress Enter to call Set() and conclude the demo.");
        Console.ReadLine();

        mre.Set();

        // If you run this example in Visual Studio, uncomment the following line:
        //Console.ReadLine();
    }

    private static void ThreadProc()
    {
        string name = Thread.CurrentThread.Name;

        Console.WriteLine(name + " starts and calls mre.WaitOne()");

        mre.WaitOne();

        Console.WriteLine(name + " ends.");
    }
}

/* This example produces output similar to the following:

Start 3 named threads that block on a ManualResetEvent:

Thread_0 starts and calls mre.WaitOne()
Thread_1 starts and calls mre.WaitOne()
Thread_2 starts and calls mre.WaitOne()

When all three threads have started, press Enter to call Set()
to release all the threads.


Thread_2 ends.
Thread_0 ends.
Thread_1 ends.

When a ManualResetEvent is signaled, threads that call WaitOne()
do not block. Press Enter to show this.


Thread_3 starts and calls mre.WaitOne()
Thread_3 ends.
Thread_4 starts and calls mre.WaitOne()
Thread_4 ends.

Press Enter to call Reset(), so that threads once again block
when they call WaitOne().


Thread_5 starts and calls mre.WaitOne()

Press Enter to call Set() and conclude the demo.

Thread_5 ends.
 */
Imports System.Threading

Public Class Example

    ' mre is used to block and release threads manually. It is
    ' created in the unsignaled state.
    Private Shared mre As New ManualResetEvent(False)

    <MTAThreadAttribute> _
    Shared Sub Main()

        Console.WriteLine(vbLf & _
            "Start 3 named threads that block on a ManualResetEvent:" & vbLf)

        For i As Integer = 0 To 2
            Dim t As New Thread(AddressOf ThreadProc)
            t.Name = "Thread_" & i
            t.Start()
        Next i

        Thread.Sleep(500)
        Console.WriteLine(vbLf & _
            "When all three threads have started, press Enter to call Set()" & vbLf & _
            "to release all the threads." & vbLf)
        Console.ReadLine()

        mre.Set()

        Thread.Sleep(500)
        Console.WriteLine(vbLf & _
            "When a ManualResetEvent is signaled, threads that call WaitOne()" & vbLf & _
            "do not block. Press Enter to show this." & vbLf)
        Console.ReadLine()

        For i As Integer = 3 To 4
            Dim t As New Thread(AddressOf ThreadProc)
            t.Name = "Thread_" & i
            t.Start()
        Next i

        Thread.Sleep(500)
        Console.WriteLine(vbLf & _
            "Press Enter to call Reset(), so that threads once again block" & vbLf & _
            "when they call WaitOne()." & vbLf)
        Console.ReadLine()

        mre.Reset()

        ' Start a thread that waits on the ManualResetEvent.
        Dim t5 As New Thread(AddressOf ThreadProc)
        t5.Name = "Thread_5"
        t5.Start()

        Thread.Sleep(500)
        Console.WriteLine(vbLf & "Press Enter to call Set() and conclude the demo.")
        Console.ReadLine()

        mre.Set()

        ' If you run this example in Visual Studio, uncomment the following line:
        'Console.ReadLine()

    End Sub


    Private Shared Sub ThreadProc()

        Dim name As String = Thread.CurrentThread.Name

        Console.WriteLine(name & " starts and calls mre.WaitOne()")

        mre.WaitOne()

        Console.WriteLine(name & " ends.")

    End Sub

End Class

' This example produces output similar to the following:
'
'Start 3 named threads that block on a ManualResetEvent:
'
'Thread_0 starts and calls mre.WaitOne()
'Thread_1 starts and calls mre.WaitOne()
'Thread_2 starts and calls mre.WaitOne()
'
'When all three threads have started, press Enter to call Set()
'to release all the threads.
'
'
'Thread_2 ends.
'Thread_0 ends.
'Thread_1 ends.
'
'When a ManualResetEvent is signaled, threads that call WaitOne()
'do not block. Press Enter to show this.
'
'
'Thread_3 starts and calls mre.WaitOne()
'Thread_3 ends.
'Thread_4 starts and calls mre.WaitOne()
'Thread_4 ends.
'
'Press Enter to call Reset(), so that threads once again block
'when they call WaitOne().
'
'
'Thread_5 starts and calls mre.WaitOne()
'
'Press Enter to call Set() and conclude the demo.
'
'Thread_5 ends.

Комментарии

Используется ManualResetEvent, AutoResetEventа также EventWaitHandle для взаимодействия с потоком (или сигналов потока). Дополнительные сведения см. в разделе "Взаимодействие с потоком" или в разделе "Обзор примитивов синхронизации ".

Когда поток начинает действие, которое должно завершиться до продолжения других потоков, он вызывает ManualResetEvent.Reset , чтобы поместить ManualResetEvent в состояние без сигнала. Этот поток можно рассматривать как контроль ManualResetEventнад . Потоки, вызывающие блок ManualResetEvent.WaitOne , ожидающие сигнала. Когда контролируемый поток завершает действие, он вызывает ManualResetEvent.Set , чтобы сигнализировать о том, что потоки ожидания могут продолжаться. Выпускаются все потоки ожидания.

После того как он будет сигнален, остается сигналом до тех пор, ManualResetEvent пока он не будет вручную сбрасываться путем вызова Reset() метода. То есть вызовы для немедленного WaitOne возврата.

Вы можете управлять начальным состоянием объекта ManualResetEvent , передав логическое значение конструктору: true если начальное состояние сигнализируется и false в противном случае.

ManualResetEventтакже можно использовать с методами и WaitAny методамиstaticWaitAll.

Начиная с версии .NET Framework версии 2.0, ManualResetEvent является производным от класса EventWaitHandle. A ManualResetEvent функционально эквивалентен созданному EventWaitHandleEventResetMode.ManualResetс .

Заметка

ManualResetEvent В отличие от класса, EventWaitHandle класс предоставляет доступ к именованным событиям синхронизации системы.

Начиная с версии .NET Framework версии 4.0, класс System.Threading.ManualResetEventSlim является упрощенной альтернативой ManualResetEvent.

Конструкторы

Имя Описание
ManualResetEvent(Boolean)

Инициализирует новый экземпляр ManualResetEvent класса с логическим значением, указывающим, следует ли задать начальное состояние для сигнала.

Поля

Имя Описание
WaitTimeout

Указывает, что операция истекла до того, WaitAny(WaitHandle[], Int32, Boolean) как любой из дескрипторов ожидания был сигналирован. Это поле является константой.

(Унаследовано от WaitHandle)

Свойства

Имя Описание
Handle
Устаревшие..
Устаревшие..

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

(Унаследовано от WaitHandle)
SafeWaitHandle

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

(Унаследовано от WaitHandle)

Методы

Имя Описание
Close()

Освобождает все ресурсы, удерживаемые текущим WaitHandle.

(Унаследовано от WaitHandle)
CreateObjRef(Type)

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

(Унаследовано от MarshalByRefObject)
Dispose()

Освобождает все ресурсы, используемые текущим экземпляром класса WaitHandle.

(Унаследовано от WaitHandle)
Dispose(Boolean)

При переопределении в производном классе освобождает неуправляемые ресурсы, используемые и WaitHandleпри необходимости освобождает управляемые ресурсы.

(Унаследовано от WaitHandle)
Equals(Object)

Определяет, равен ли указанный объект текущему объекту.

(Унаследовано от Object)
GetAccessControl()

EventWaitHandleSecurity Возвращает объект, представляющий безопасность управления доступом для именованного системного события, представленного текущим EventWaitHandle объектом.

(Унаследовано от EventWaitHandle)
GetHashCode()

Служит хэш-функцией по умолчанию.

(Унаследовано от Object)
GetLifetimeService()
Устаревшие..

Извлекает текущий объект службы времени существования, который управляет политикой времени существования для этого экземпляра.

(Унаследовано от MarshalByRefObject)
GetType()

Возвращает Type текущего экземпляра.

(Унаследовано от Object)
InitializeLifetimeService()
Устаревшие..

Получает объект службы времени существования для управления политикой времени существования для этого экземпляра.

(Унаследовано от MarshalByRefObject)
MemberwiseClone()

Создает неглубокую копию текущей Object.

(Унаследовано от Object)
MemberwiseClone(Boolean)

Создает неглубокую копию текущего MarshalByRefObject объекта.

(Унаследовано от MarshalByRefObject)
Reset()

Задает состояние события незначаемой, что приводит к блокировке потоков.

Reset()

Задает состояние события незначаемой, что приводит к блокировке потоков.

(Унаследовано от EventWaitHandle)
Set()

Задает состояние сигнала события, что позволяет продолжить один или несколько потоков ожидания.

Set()

Задает состояние сигнала события, что позволяет продолжить один или несколько потоков ожидания.

(Унаследовано от EventWaitHandle)
SetAccessControl(EventWaitHandleSecurity)

Задает безопасность управления доступом для именованного системного события.

(Унаследовано от EventWaitHandle)
ToString()

Возвращает строку, представляющую текущий объект.

(Унаследовано от Object)
WaitOne()

Блокирует текущий поток, пока текущий WaitHandle не получит сигнал.

(Унаследовано от WaitHandle)
WaitOne(Int32, Boolean)

Блокирует текущий поток, пока текущий WaitHandle не получит сигнал, используя 32-разрядное целое число со знаком, чтобы указать интервал времени и указать, следует ли выйти из домена синхронизации перед ожиданием.

(Унаследовано от WaitHandle)
WaitOne(Int32)

Блокирует текущий поток, пока текущий WaitHandle не получит сигнал, используя 32-разрядное целое число со знаком, чтобы указать интервал времени в миллисекундах.

(Унаследовано от WaitHandle)
WaitOne(TimeSpan, Boolean)

Блокирует текущий поток, пока текущий экземпляр не получит сигнал, используя TimeSpan интервал времени и указав, следует ли выйти из домена синхронизации перед ожиданием.

(Унаследовано от WaitHandle)
WaitOne(TimeSpan)

Блокирует текущий поток, пока текущий экземпляр не получит сигнал, используя TimeSpan интервал времени.

(Унаследовано от WaitHandle)

Явные реализации интерфейса

Имя Описание
IDisposable.Dispose()

Этот API поддерживает инфраструктуру продукта и не предназначен для использования непосредственно из программного кода.

Освобождает все ресурсы, используемые параметром WaitHandle.

(Унаследовано от WaitHandle)

Методы расширения

Имя Описание
GetAccessControl(EventWaitHandle)

Возвращает дескрипторы безопасности для указанного handle.

GetSafeWaitHandle(WaitHandle)

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

SetAccessControl(EventWaitHandle, EventWaitHandleSecurity)

Задает дескрипторы безопасности для указанного дескриптора ожидания события.

SetSafeWaitHandle(WaitHandle, SafeWaitHandle)

Задает безопасный дескриптор для собственного дескриптора ожидания операционной системы.

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

Потокобезопасность

Этот класс является потокобезопасной.

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