CountdownEvent クラス
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
カウントが 0 になったときに通知される同期プリミティブを表します。
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
- 継承
-
CountdownEvent
- 属性
- 実装
例
次の例は、 を使用する方法を 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
コンストラクター
CountdownEvent(Int32) |
指定されたカウントを使用して CountdownEvent クラスの新しいインスタンスを初期化します。 |
プロパティ
CurrentCount |
イベントの設定に必要な残りの通知の数を取得します。 |
InitialCount |
イベントの設定に最初に必要な通知の数を取得します。 |
IsSet |
CountdownEvent オブジェクトの現在の数が 0 に達したかどうかを示します。 |
WaitHandle |
イベントの設定を待機するために使用する WaitHandle を取得します。 |
メソッド
AddCount() |
CountdownEvent の現在のカウントを 1 つインクリメントします。 |
AddCount(Int32) |
CountdownEvent の現在のカウントを指定された値だけインクリメントします。 |
Dispose() |
CountdownEvent クラスの現在のインスタンスによって使用されているすべてのリソースを解放します。 |
Dispose(Boolean) |
CountdownEvent が使用しているアンマネージド リソースを解放します。オプションとして、マネージド リソースを解放することもできます。 |
Equals(Object) |
指定されたオブジェクトが現在のオブジェクトと等しいかどうかを判断します。 (継承元 Object) |
GetHashCode() |
既定のハッシュ関数として機能します。 (継承元 Object) |
GetType() |
現在のインスタンスの Type を取得します。 (継承元 Object) |
MemberwiseClone() |
現在の Object の簡易コピーを作成します。 (継承元 Object) |
Reset() |
CurrentCount を InitialCount の値にリセットします。 |
Reset(Int32) |
InitialCount プロパティを指定した値にリセットします。 |
Signal() |
通知を CountdownEvent に登録して、CurrentCount の値をデクリメントします。 |
Signal(Int32) |
複数の通知を CountdownEvent に登録して、CurrentCount の値を指定された量だけデクリメントします。 |
ToString() |
現在のオブジェクトを表す文字列を返します。 (継承元 Object) |
TryAddCount() |
CurrentCount を 1 つインクリメントすることを試みます。 |
TryAddCount(Int32) |
CurrentCount を指定した値だけインクリメントすることを試みます。 |
Wait() |
CountdownEvent が設定されるまで、現在のスレッドをブロックします。 |
Wait(CancellationToken) |
CountdownEvent を観察すると同時に、CancellationToken が設定されるまで、現在のスレッドをブロックします。 |
Wait(Int32) |
32 ビット符号付き整数を使用してタイムアウトを計測し、CountdownEvent が設定されるまで、現在のスレッドをブロックします。 |
Wait(Int32, CancellationToken) |
CountdownEvent を観察すると同時に、32 ビット符号付き整数を使用してタイムアウトを計測し、現在の CancellationToken が設定されるまで、現在のスレッドをブロックします。 |
Wait(TimeSpan) |
CountdownEvent を使用してタイムアウトを計測し、TimeSpan が設定されるまで、現在のスレッドをブロックします。 |
Wait(TimeSpan, CancellationToken) |
CountdownEvent を観察すると同時に、TimeSpan を使用してタイムアウトを計測し、CancellationToken が設定されるまで、現在のスレッドをブロックします。 |
適用対象
スレッド セーフ
のすべてのパブリック メンバーと保護されたメンバーCountdownEventはスレッド セーフであり、複数のDispose()スレッドから同時に使用できます。例外は、 に対する他のすべての操作が完了した場合にのみ使用する必要があります。また、 は、Reset()他のスレッドがイベントにCountdownEventアクセスしていない場合にのみ使用する必要があります。
こちらもご覧ください
.NET