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를 증가하려고 시도했습니다. |
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(), 다른 모든 작업이 CountdownEvent 완료된 경우에만 사용해야 하며 Reset(), 다른 스레드가 이벤트에 액세스하지 않는 경우에만 사용해야 합니다.