Barrier Klasse

Definition

Ermöglicht es mehreren Aufgaben, kooperativ an einem Algorithmus parallel über mehrere Phasen zu arbeiten.

public ref class Barrier : IDisposable
public class Barrier : IDisposable
[System.Runtime.InteropServices.ComVisible(false)]
public class Barrier : IDisposable
type Barrier = class
    interface IDisposable
[<System.Runtime.InteropServices.ComVisible(false)>]
type Barrier = class
    interface IDisposable
Public Class Barrier
Implements IDisposable
Vererbung
Barrier
Attribute
Implementiert

Beispiele

Das folgende Beispiel zeigt, wie sie eine Barriere verwenden:

using System;
using System.Threading;
using System.Threading.Tasks;

class BarrierDemo
{
    // Demonstrates:
    //      Barrier constructor with post-phase action
    //      Barrier.AddParticipants()
    //      Barrier.RemoveParticipant()
    //      Barrier.SignalAndWait(), incl. a BarrierPostPhaseException being thrown
    static void BarrierSample()
    {
        int count = 0;

        // Create a barrier with three participants
        // Provide a post-phase action that will print out certain information
        // And the third time through, it will throw an exception
        Barrier barrier = new Barrier(3, (b) =>
        {
            Console.WriteLine("Post-Phase action: count={0}, phase={1}", count, b.CurrentPhaseNumber);
            if (b.CurrentPhaseNumber == 2) throw new Exception("D'oh!");
        });

        // Nope -- changed my mind.  Let's make it five participants.
        barrier.AddParticipants(2);

        // Nope -- let's settle on four participants.
        barrier.RemoveParticipant();

        // This is the logic run by all participants
        Action action = () =>
        {
            Interlocked.Increment(ref count);
            barrier.SignalAndWait(); // during the post-phase action, count should be 4 and phase should be 0
            Interlocked.Increment(ref count);
            barrier.SignalAndWait(); // during the post-phase action, count should be 8 and phase should be 1

            // The third time, SignalAndWait() will throw an exception and all participants will see it
            Interlocked.Increment(ref count);
            try
            {
                barrier.SignalAndWait();
            }
            catch (BarrierPostPhaseException bppe)
            {
                Console.WriteLine("Caught BarrierPostPhaseException: {0}", bppe.Message);
            }

            // The fourth time should be hunky-dory
            Interlocked.Increment(ref count);
            barrier.SignalAndWait(); // during the post-phase action, count should be 16 and phase should be 3
        };

        // Now launch 4 parallel actions to serve as 4 participants
        Parallel.Invoke(action, action, action, action);

        // This (5 participants) would cause an exception:
        // Parallel.Invoke(action, action, action, action, action);
        //      "System.InvalidOperationException: The number of threads using the barrier
        //      exceeded the total number of registered participants."

        // It's good form to Dispose() a barrier when you're done with it.
        barrier.Dispose();
    }
}
Imports System.Threading
Imports System.Threading.Tasks

Module BarrierSample

    ' Demonstrates:
    ' Barrier constructor with post-phase action
    ' Barrier.AddParticipants()
    ' Barrier.RemoveParticipant()
    ' Barrier.SignalAndWait(), incl. a BarrierPostPhaseException being thrown
    Sub Main()
        Dim count As Integer = 0

        ' Create a barrier with three participants
        ' Provide a post-phase action that will print out certain information
        ' And the third time through, it will throw an exception
        Dim barrier As New Barrier(3,
                                   Sub(b)
                                       Console.WriteLine("Post-Phase action: count={0}, phase={1}", count, b.CurrentPhaseNumber)
                                       If b.CurrentPhaseNumber = 2 Then
                                           Throw New Exception("D'oh!")
                                       End If
                                   End Sub)

        ' Nope -- changed my mind. Let's make it five participants.
        barrier.AddParticipants(2)

        ' Nope -- let's settle on four participants.
        barrier.RemoveParticipant()


        ' This is the logic run by all participants
        Dim action As Action =
            Sub()
                Interlocked.Increment(count)
                barrier.SignalAndWait()
                ' during the post-phase action, count should be 4 and phase should be 0

                Interlocked.Increment(count)
                barrier.SignalAndWait()
                ' during the post-phase action, count should be 8 and phase should be 1

                ' The third time, SignalAndWait() will throw an exception and all participants will see it
                Interlocked.Increment(count)
                Try
                    barrier.SignalAndWait()
                Catch bppe As BarrierPostPhaseException
                    Console.WriteLine("Caught BarrierPostPhaseException: {0}", bppe.Message)
                End Try

                ' The fourth time should be hunky-dory
                Interlocked.Increment(count)
                ' during the post-phase action, count should be 16 and phase should be 3
                barrier.SignalAndWait()

            End Sub

        ' Now launch 4 parallel actions to serve as 4 participants
        Parallel.Invoke(action, action, action, action)

        ' This (5 participants) would cause an exception:
        '   Parallel.Invoke(action, action, action, action, action)
        ' "System.InvalidOperationException: The number of threads using the barrier
        ' exceeded the total number of registered participants."

        ' It's good form to Dispose() a barrier when you're done with it.
        barrier.Dispose()
    End Sub
End Module

Hinweise

Eine Gruppe von Aufgaben arbeitet zusammen, indem sie sich durch eine Reihe von Phasen bewegen, in denen jeder in der Gruppe signalisiert, dass es in einer bestimmten Phase angekommen Barrier ist und implizit wartet, bis alle anderen ankommen. Dasselbe Barrier kann für mehrere Phasen verwendet werden.

Konstruktoren

Name Beschreibung
Barrier(Int32, Action<Barrier>)

Initialisiert eine neue Instanz der Barrier-Klasse.

Barrier(Int32)

Initialisiert eine neue Instanz der Barrier-Klasse.

Eigenschaften

Name Beschreibung
CurrentPhaseNumber

Ruft die Anzahl der aktuellen Phase der Barriere ab.

ParticipantCount

Ruft die Gesamtzahl der Teilnehmer in der Barriere ab.

ParticipantsRemaining

Ruft die Anzahl der Teilnehmer in der Barriere ab, die noch nicht in der aktuellen Phase signalisiert wurden.

Methoden

Name Beschreibung
AddParticipant()

benachrichtigt, Barrier dass ein zusätzlicher Teilnehmer vorhanden ist.

AddParticipants(Int32)

Benachrichtigt die Barrier Teilnehmer darüber, dass weitere Teilnehmer vorhanden sind.

Dispose()

Gibt alle Ressourcen frei, die von der aktuellen Instanz der Barrier Klasse verwendet werden.

Dispose(Boolean)

Gibt die nicht verwalteten Ressourcen frei, die von den Barrierverwalteten Ressourcen verwendet werden, und gibt optional die verwalteten Ressourcen frei.

Equals(Object)

Bestimmt, ob das angegebene Objekt dem aktuellen Objekt entspricht.

(Geerbt von Object)
GetHashCode()

Dient als Standardhashfunktion.

(Geerbt von Object)
GetType()

Ruft die Type der aktuellen Instanz ab.

(Geerbt von Object)
MemberwiseClone()

Erstellt eine flache Kopie der aktuellen Object.

(Geerbt von Object)
RemoveParticipant()

Benachrichtigt, Barrier dass es einen weniger Teilnehmer gibt.

RemoveParticipants(Int32)

benachrichtigt, Barrier dass weniger Teilnehmer vorhanden sein werden.

SignalAndWait()

Signalisiert, dass ein Teilnehmer die Barriere erreicht hat und wartet, bis alle anderen Teilnehmer auch die Barriere erreichen.

SignalAndWait(CancellationToken)

Signalisiert, dass ein Teilnehmer die Barriere erreicht hat und wartet, bis alle anderen Teilnehmer die Barriere erreichen, während ein Abbruchtoken beobachtet wird.

SignalAndWait(Int32, CancellationToken)

Signalisiert, dass ein Teilnehmer die Barriere erreicht hat und wartet, bis alle anderen Teilnehmer auch die Barriere erreichen, wobei eine 32-Bit-Ganzzahl verwendet wird, um das Timeout zu messen, während ein Abbruchtoken beobachtet wird.

SignalAndWait(Int32)

Signalisiert, dass ein Teilnehmer die Barriere erreicht hat und wartet, bis alle anderen Teilnehmer auch die Barriere erreichen, wobei eine 32-Bit-Ganzzahl verwendet wird, um das Timeout zu messen.

SignalAndWait(TimeSpan, CancellationToken)

Signalisiert, dass ein Teilnehmer die Barriere erreicht hat und wartet, bis alle anderen Teilnehmer auch die Barriere erreichen, indem ein TimeSpan Objekt verwendet wird, um das Zeitintervall zu messen, während ein Abbruchtoken beobachtet wird.

SignalAndWait(TimeSpan)

Signalisiert, dass ein Teilnehmer die Barriere erreicht hat und wartet, bis alle anderen Teilnehmer auch die Barriere erreichen, indem ein TimeSpan Objekt verwendet wird, um das Zeitintervall zu messen.

ToString()

Gibt eine Zeichenfolge zurück, die das aktuelle Objekt darstellt.

(Geerbt von Object)

Gilt für:

Threadsicherheit

Alle öffentlichen und geschützten Member von Barrier sind threadsicher und können gleichzeitig aus mehreren Threads verwendet werden, mit Ausnahme von Dispose, die nur verwendet werden müssen, wenn alle anderen Vorgänge auf dem Barrier Vorgang abgeschlossen sind.

Weitere Informationen