CountdownEvent 類別

定義

代表當計數到達零時收到訊號的同步處理原始物件。

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 物件的目前計數是否已達到零。

WaitHandle

取得用來等候事件獲得設定的 WaitHandle

方法

AddCount()

CountdownEvent 目前的計數遞增一。

AddCount(Int32)

CountdownEvent 目前的計數遞增所指定的值。

Dispose()

釋放 CountdownEvent 類別目前的執行個體所使用的全部資源。

Dispose(Boolean)

釋放 CountdownEvent 所使用的 Unmanaged 資源,並選擇性釋放 Managed 資源。

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)

封鎖目前的執行緒,直到設定了 CountdownEvent 為止 (使用 32 位元帶正負號的整數以測量逾時)。

Wait(Int32, CancellationToken)

封鎖目前的執行緒,直到設定了 CountdownEvent 為止 (使用 32 位元帶正負號的整數以測量逾時),同時觀察 CancellationToken

Wait(TimeSpan)

封鎖目前的執行緒,直到設定了 CountdownEvent 為止 (使用 TimeSpan 以測量逾時)。

Wait(TimeSpan, CancellationToken)

封鎖目前的執行緒,直到設定了 CountdownEvent 為止 (使用 TimeSpan 以測量逾時),同時觀察 CancellationToken

適用於

執行緒安全性

的所有公用和受保護成員 CountdownEvent 都是安全線程,而且可以從多個執行緒同時使用,但例外狀況除外,唯 Dispose() 有在 上完成所有其他作業 CountdownEvent 時才使用,而且 Reset() 只有在沒有其他執行緒存取事件時,才應該使用這個成員。

另請參閱