CountdownEvent 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.
Representerar en synkroniseringspri primitiv som signaleras när antalet når noll.
public ref class CountdownEvent : IDisposable
public class CountdownEvent : IDisposable
[System.Runtime.InteropServices.ComVisible(false)]
public class CountdownEvent : IDisposable
type CountdownEvent = class
interface IDisposable
[<System.Runtime.InteropServices.ComVisible(false)>]
type CountdownEvent = class
interface IDisposable
Public Class CountdownEvent
Implements IDisposable
- Arv
-
CountdownEvent
- Attribut
- Implementeringar
Exempel
I följande exempel visas hur du använder en CountdownEvent:
using System;
using System.Collections.Concurrent;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
class Example
{
static async Task Main()
{
// Initialize a queue and a CountdownEvent
ConcurrentQueue<int> queue = new ConcurrentQueue<int>(Enumerable.Range(0, 10000));
CountdownEvent cde = new CountdownEvent(10000); // initial count = 10000
// This is the logic for all queue consumers
Action consumer = () =>
{
int local;
// decrement CDE count once for each element consumed from queue
while (queue.TryDequeue(out local)) cde.Signal();
};
// Now empty the queue with a couple of asynchronous tasks
Task t1 = Task.Factory.StartNew(consumer);
Task t2 = Task.Factory.StartNew(consumer);
// And wait for queue to empty by waiting on cde
cde.Wait(); // will return when cde count reaches 0
Console.WriteLine("Done emptying queue. InitialCount={0}, CurrentCount={1}, IsSet={2}",
cde.InitialCount, cde.CurrentCount, cde.IsSet);
// Proper form is to wait for the tasks to complete, even if you know that their work
// is done already.
await Task.WhenAll(t1, t2);
// Resetting will cause the CountdownEvent to un-set, and resets InitialCount/CurrentCount
// to the specified value
cde.Reset(10);
// AddCount will affect the CurrentCount, but not the InitialCount
cde.AddCount(2);
Console.WriteLine("After Reset(10), AddCount(2): InitialCount={0}, CurrentCount={1}, IsSet={2}",
cde.InitialCount, cde.CurrentCount, cde.IsSet);
// Now try waiting with cancellation
CancellationTokenSource cts = new CancellationTokenSource();
cts.Cancel(); // cancels the CancellationTokenSource
try
{
cde.Wait(cts.Token);
}
catch (OperationCanceledException)
{
Console.WriteLine("cde.Wait(preCanceledToken) threw OCE, as expected");
}
finally
{
cts.Dispose();
}
// It's good to release a CountdownEvent when you're done with it.
cde.Dispose();
}
}
// The example displays the following output:
// Done emptying queue. InitialCount=10000, CurrentCount=0, IsSet=True
// After Reset(10), AddCount(2): InitialCount=10, CurrentCount=12, IsSet=False
// cde.Wait(preCanceledToken) threw OCE, as expected
Imports System.Collections.Concurrent
Imports System.Linq
Imports System.Threading
Imports System.Threading.Tasks
Module Example
Sub Main()
' Initialize a queue and a CountdownEvent
Dim queue As New ConcurrentQueue(Of Integer)(Enumerable.Range(0, 10000))
Dim cde As New CountdownEvent(10000)
' initial count = 10000
' This is the logic for all queue consumers
Dim consumer As Action =
Sub()
Dim local As Integer
' decrement CDE count once for each element consumed from queue
While queue.TryDequeue(local)
cde.Signal()
End While
End Sub
' Now empty the queue with a couple of asynchronous tasks
Dim t1 As Task = Task.Factory.StartNew(consumer)
Dim t2 As Task = Task.Factory.StartNew(consumer)
' And wait for queue to empty by waiting on cde
cde.Wait()
' will return when cde count reaches 0
Console.WriteLine("Done emptying queue. InitialCount={0}, CurrentCount={1}, IsSet={2}", cde.InitialCount, cde.CurrentCount, cde.IsSet)
' Proper form is to wait for the tasks to complete, even if you know that their work
' is done already.
Task.WaitAll(t1, t2)
' Resetting will cause the CountdownEvent to un-set, and resets InitialCount/CurrentCount
' to the specified value
cde.Reset(10)
' AddCount will affect the CurrentCount, but not the InitialCount
cde.AddCount(2)
Console.WriteLine("After Reset(10), AddCount(2): InitialCount={0}, CurrentCount={1}, IsSet={2}", cde.InitialCount, cde.CurrentCount, cde.IsSet)
' Now try waiting with cancellation
Dim cts As New CancellationTokenSource()
cts.Cancel()
' cancels the CancellationTokenSource
Try
cde.Wait(cts.Token)
Catch generatedExceptionName As OperationCanceledException
Console.WriteLine("cde.Wait(preCanceledToken) threw OCE, as expected")
Finally
cts.Dispose()
End Try
' It's good to release a CountdownEvent when you're done with it.
cde.Dispose()
End Sub
End Module
' The example displays the following output:
' Done emptying queue. InitialCount=10000, CurrentCount=0, IsSet=True
' After Reset(10), AddCount(2): InitialCount=10, CurrentCount=12, IsSet=False
' cde.Wait(preCanceledToken) threw OCE, as expected
Konstruktorer
| Name | Description |
|---|---|
| CountdownEvent(Int32) |
Initierar en ny instans av CountdownEvent klassen med det angivna antalet. |
Egenskaper
| Name | Description |
|---|---|
| CurrentCount |
Hämtar det antal återstående signaler som krävs för att ange händelsen. |
| InitialCount |
Hämtar det antal signaler som ursprungligen krävs för att ange händelsen. |
| IsSet |
Anger om objektets CountdownEvent aktuella antal har nått noll. |
| WaitHandle |
Hämtar en WaitHandle som används för att vänta tills händelsen har angetts. |
Metoder
| Name | Description |
|---|---|
| AddCount() |
Ökar det CountdownEventaktuella antalet med ett. |
| AddCount(Int32) |
Ökar det CountdownEventaktuella antalet med ett angivet värde. |
| Dispose() |
Släpper alla resurser som används av den aktuella instansen CountdownEvent av klassen. |
| Dispose(Boolean) |
Släpper de ohanterade resurser som används av CountdownEvent, 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) |
| GetHashCode() |
Fungerar som standard-hash-funktion. (Ärvd från Object) |
| GetType() |
Hämtar den aktuella instansen Type . (Ärvd från Object) |
| MemberwiseClone() |
Skapar en ytlig kopia av den aktuella Object. (Ärvd från Object) |
| Reset() |
Återställer CurrentCount värdet för InitialCount. |
| Reset(Int32) |
Återställer egenskapen InitialCount till ett angivet värde. |
| Signal() |
Registrerar en signal med CountdownEvent, vilket minskar värdet för CurrentCount. |
| Signal(Int32) |
Registrerar flera signaler med CountdownEvent, vilket minskar värdet CurrentCount för med det angivna beloppet. |
| ToString() |
Returnerar en sträng som representerar det aktuella objektet. (Ärvd från Object) |
| TryAddCount() |
Försöker öka med CurrentCount en. |
| TryAddCount(Int32) |
Försöker öka med CurrentCount ett angivet värde. |
| Wait() |
Blockerar den aktuella tråden tills den CountdownEvent har angetts. |
| Wait(CancellationToken) |
Blockerar den aktuella tråden tills den CountdownEvent har angetts, samtidigt som en CancellationToken. |
| Wait(Int32, CancellationToken) |
Blockerar den aktuella tråden tills den CountdownEvent har angetts, med hjälp av ett 32-bitars signerat heltal för att mäta tidsgränsen, samtidigt som en CancellationToken. |
| Wait(Int32) |
Blockerar den aktuella tråden tills den CountdownEvent har angetts med hjälp av ett 32-bitars signerat heltal för att mäta tidsgränsen. |
| Wait(TimeSpan, CancellationToken) |
Blockerar den aktuella tråden tills den CountdownEvent har angetts, med hjälp av en TimeSpan för att mäta tidsgränsen, medan du observerar en CancellationToken. |
| Wait(TimeSpan) |
Blockerar den aktuella tråden tills den CountdownEvent har angetts, med hjälp av en TimeSpan för att mäta tidsgränsen. |
Gäller för
Trådsäkerhet
Alla offentliga och skyddade medlemmar CountdownEvent i är trådsäkra och kan användas samtidigt från flera trådar, med undantag för Dispose(), som endast får användas när alla andra åtgärder på CountdownEvent har slutförts och Reset(), som endast ska användas när inga andra trådar kommer åt händelsen.