WaitHandle Klass
Definition
Viktigt
En del information gäller för förhandsversionen av en produkt och kan komma att ändras avsevärt innan produkten blir allmänt tillgänglig. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, avseende informationen som visas här.
Kapslar in operativsystemspecifika objekt som väntar på exklusiv åtkomst till delade resurser.
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
- Arv
-
WaitHandle
- Arv
- Härledda
- Attribut
- Implementeringar
Exempel
I följande kodexempel visas hur två trådar kan utföra bakgrundsaktiviteter medan huvudtråden väntar på att aktiviteterna ska slutföras med hjälp av WaitAny klassens statiska WaitAll metoder och WaitHandle metoder.
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).
Kommentarer
Klassen WaitHandle kapslar in ett inbyggt operativsystemets synkroniseringshandtag och används för att representera alla synkroniseringsobjekt i körningen som tillåter flera vänteåtgärder. En jämförelse av väntereferenser med andra synkroniseringsobjekt finns i Översikt över synkroniseringsprimatorer.
Själva WaitHandle klassen är abstrakt. Klasser som härleds från WaitHandle definierar en signalmekanism för att ange att åtkomsten till en delad resurs ska öppnas eller frigöras, men de använder de ärvda WaitHandle metoderna för att blockera i väntan på åtkomst till delade resurser. Klasserna som härleds från WaitHandle inkluderar:
Klassen EventWaitHandle och dess härledda klasser, AutoResetEvent och ManualResetEvent.
Klassen Semaphore . Se Semafor och SemaphoreSlim.
Trådar kan blockeras på en enskild väntereferens genom att anropa instansmetoden WaitOne, som ärvs av klasser som härletts från WaitHandle.
De härledda klasserna WaitHandle skiljer sig åt i sin trådtillhörighet. Händelseväntereferenser (EventWaitHandle, AutoResetEvent, och ManualResetEvent) och semaforer har inte trådtillhörighet. Alla trådar kan signalera ett händelseväntehandtag eller semafor. Mutexes, å andra sidan, har trådtillhörighet; tråden som äger en mutex måste släppa den och ett undantag utlöses om en tråd anropar ReleaseMutex metoden på en mutex som den inte äger.
WaitHandle Eftersom klassen härleds från MarshalByRefObjectkan dessa klasser användas för att synkronisera aktiviteter för trådar över programdomängränser.
Förutom sina härledda klasser WaitHandle har klassen ett antal statiska metoder som blockerar en tråd tills ett eller flera synkroniseringsobjekt får en signal. Dessa inkluderar:
SignalAndWait, vilket gör att en tråd kan signalera ett väntehandtag och omedelbart vänta på en annan.
WaitAll, vilket gör att en tråd kan vänta tills alla väntehandtag i en matris får en signal.
WaitAny, vilket gör att en tråd kan vänta tills någon av en angiven uppsättning väntehandtag har signalerats.
Överlagringarna av dessa metoder ger tidsgränsintervall för att avbryta väntetiden och möjligheten att avsluta en synkroniseringskontext innan du går in i väntan, vilket gör att andra trådar kan använda synkroniseringskontexten.
Important
Den här typen implementerar IDisposable gränssnittet. När du har använt typen eller en typ som härletts från den bör du ta bort den direkt eller indirekt. Om du vill ta bort typen direkt anropar du dess Close metod i ett try/catch block. Om du vill ta bort det indirekt använder du en språkkonstruktion som using (i C#) eller Using (i Visual Basic). Mer information finns i avsnittet "Använda ett objekt som implementerar IDisposable" i IDisposable gränssnittet.
WaitHandle implementerar Dispose mönstret. Se Implementera en Avyttringsmetod. När du härleder från WaitHandleanvänder du SafeWaitHandle egenskapen för att lagra ditt interna operativsystemhandtag. Du behöver inte åsidosätta den skyddade Dispose metoden om du inte använder ytterligare ohanterade resurser.
Konstruktorer
| Name | Description |
|---|---|
| WaitHandle() |
Initierar en ny instans av WaitHandle klassen. |
Fält
| Name | Description |
|---|---|
| InvalidHandle |
Representerar ett ogiltigt inbyggt operativsystemhandtag. Detta fält är skrivskyddat. |
| WaitTimeout |
Anger att tidsgränsen för en WaitAny(WaitHandle[], Int32, Boolean) åtgärd uppstod innan någon av väntehandtagen signalerades. Det här fältet är konstant. |
Egenskaper
| Name | Description |
|---|---|
| Handle |
Föråldrad.
Föråldrad.
Hämtar eller anger det interna operativsystemets handtag. |
| SafeWaitHandle |
Hämtar eller anger det interna operativsystemets handtag. |
Metoder
| Name | Description |
|---|---|
| Close() |
Släpper alla resurser som innehas av den aktuella WaitHandle. |
| CreateObjRef(Type) |
Skapar ett objekt som innehåller all relevant information som krävs för att generera en proxy som används för att kommunicera med ett fjärrobjekt. (Ärvd från MarshalByRefObject) |
| Dispose() |
Släpper alla resurser som används av den aktuella instansen WaitHandle av klassen. |
| Dispose(Boolean) |
När de åsidosättas i en härledd klass släpper du de ohanterade resurser som används av WaitHandle, och släpper eventuellt de hanterade resurserna. |
| Equals(Object) |
Avgör om det angivna objektet är lika med det aktuella objektet. (Ärvd från Object) |
| Finalize() |
Frigör de resurser som innehas av den aktuella instansen. |
| GetHashCode() |
Fungerar som standard-hash-funktion. (Ärvd från Object) |
| GetLifetimeService() |
Föråldrad.
Hämtar det aktuella livslängdstjänstobjektet som styr livslängdsprincipen för den här instansen. (Ärvd från MarshalByRefObject) |
| GetType() |
Hämtar den aktuella instansen Type . (Ärvd från Object) |
| InitializeLifetimeService() |
Föråldrad.
Hämtar ett tjänstobjekt för livslängd för att styra livslängdsprincipen för den här instansen. (Ärvd från MarshalByRefObject) |
| MemberwiseClone() |
Skapar en ytlig kopia av den aktuella Object. (Ärvd från Object) |
| MemberwiseClone(Boolean) |
Skapar en ytlig kopia av det aktuella MarshalByRefObject objektet. (Ärvd från MarshalByRefObject) |
| SignalAndWait(WaitHandle, WaitHandle, Int32, Boolean) |
Signalerar en WaitHandle och väntar på en annan, anger ett tidsgränsintervall som ett 32-bitars signerat heltal och anger om synkroniseringsdomänen ska avslutas för kontexten innan du anger väntetiden. |
| SignalAndWait(WaitHandle, WaitHandle, TimeSpan, Boolean) |
Signalerar en WaitHandle och väntar på en annan, anger tidsgränsintervallet som ett TimeSpan och anger om synkroniseringsdomänen ska avslutas för kontexten innan du anger väntetiden. |
| SignalAndWait(WaitHandle, WaitHandle) |
Signalerar en WaitHandle och väntar på en annan. |
| ToString() |
Returnerar en sträng som representerar det aktuella objektet. (Ärvd från Object) |
| WaitAll(WaitHandle[], Int32, Boolean) |
Väntar på att alla element i den angivna matrisen ska ta emot en signal med hjälp av ett Int32 värde för att ange tidsintervallet och ange om synkroniseringsdomänen ska avslutas före väntan. |
| WaitAll(WaitHandle[], Int32) |
Väntar på att alla element i den angivna matrisen ska ta emot en signal med hjälp av ett Int32 värde för att ange tidsintervallet. |
| WaitAll(WaitHandle[], TimeSpan, Boolean) |
Väntar på att alla element i den angivna matrisen ska ta emot en signal med hjälp av ett TimeSpan värde för att ange tidsintervallet och ange om synkroniseringsdomänen ska avslutas före väntan. |
| WaitAll(WaitHandle[], TimeSpan) |
Väntar på att alla element i den angivna matrisen ska ta emot en signal med hjälp av ett TimeSpan värde för att ange tidsintervallet. |
| WaitAll(WaitHandle[]) |
Väntar på att alla element i den angivna matrisen ska ta emot en signal. |
| WaitAny(WaitHandle[], Int32, Boolean) |
Väntar på att något av elementen i den angivna matrisen ska ta emot en signal med hjälp av ett 32-bitars signerat heltal för att ange tidsintervallet och ange om synkroniseringsdomänen ska avslutas före väntan. |
| WaitAny(WaitHandle[], Int32) |
Väntar på att något av elementen i den angivna matrisen ska ta emot en signal med hjälp av ett 32-bitars signerat heltal för att ange tidsintervallet. |
| WaitAny(WaitHandle[], TimeSpan, Boolean) |
Väntar på att något av elementen i den angivna matrisen ska ta emot en signal, med hjälp av en TimeSpan för att ange tidsintervallet och ange om synkroniseringsdomänen ska avslutas före väntan. |
| WaitAny(WaitHandle[], TimeSpan) |
Väntar på att något av elementen i den angivna matrisen ska ta emot en signal med hjälp av en TimeSpan för att ange tidsintervallet. |
| WaitAny(WaitHandle[]) |
Väntar på att något av elementen i den angivna matrisen ska ta emot en signal. |
| WaitOne() |
Blockerar den aktuella tråden tills strömmen WaitHandle tar emot en signal. |
| WaitOne(Int32, Boolean) |
Blockerar den aktuella tråden tills den aktuella WaitHandle tar emot en signal med ett 32-bitars signerat heltal för att ange tidsintervallet och ange om synkroniseringsdomänen ska avslutas före väntan. |
| WaitOne(Int32) |
Blockerar den aktuella tråden tills strömmen WaitHandle tar emot en signal med hjälp av ett 32-bitars signerat heltal för att ange tidsintervallet i millisekunder. |
| WaitOne(TimeSpan, Boolean) |
Blockerar den aktuella tråden tills den aktuella instansen tar emot en signal med hjälp av en TimeSpan för att ange tidsintervallet och ange om synkroniseringsdomänen ska avslutas före väntan. |
| WaitOne(TimeSpan) |
Blockerar den aktuella tråden tills den aktuella instansen tar emot en signal med hjälp av en TimeSpan för att ange tidsintervallet. |
Explicita gränssnittsimplementeringar
| Name | Description |
|---|---|
| IDisposable.Dispose() |
Detta API stöder produktinfrastrukturen och är inte avsett att användas direkt från koden. Släpper alla resurser som används av WaitHandle. |
Tilläggsmetoder
| Name | Description |
|---|---|
| GetSafeWaitHandle(WaitHandle) |
Hämtar det säkra handtaget för ett inbyggt väntehandtag för operativsystemet. |
| SetSafeWaitHandle(WaitHandle, SafeWaitHandle) |
Anger ett säkert handtag för ett inbyggt väntehandtag för operativsystemet. |
Gäller för
Trådsäkerhet
Den här typen är trådsäker.