Movatterモバイル変換


[0]ホーム

URL:


Skip to main contentSkip to in-page navigation

This browser is no longer supported.

Upgrade to Microsoft Edge to take advantage of the latest features, security updates, and technical support.

Download Microsoft EdgeMore info about Internet Explorer and Microsoft Edge
Table of contentsExit editor mode

Barrier Class

Definition

Namespace:
System.Threading
Assemblies:
System.dll, System.Threading.dll
Assemblies:
netstandard.dll, System.Threading.dll
Assembly:
System.Threading.dll
Assembly:
System.dll
Assembly:
netstandard.dll
Source:
Barrier.cs
Source:
Barrier.cs
Source:
Barrier.cs
Source:
Barrier.cs

Important

Some information relates to prerelease product that may be substantially modified before it’s released. Microsoft makes no warranties, express or implied, with respect to the information provided here.

Enables multiple tasks to cooperatively work on an algorithm in parallel through multiple phases.

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 BarrierImplements IDisposable
Inheritance
Barrier
Attributes
Implements

Examples

The following example shows how to use a barrier:

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.ThreadingImports System.Threading.TasksModule 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 SubEnd Module

Remarks

A group of tasks cooperate by moving through a series of phases, where each in the group signals it has arrived at theBarrier in a given phase and implicitly waits for all others to arrive. The sameBarrier can be used for multiple phases.

Constructors

Barrier(Int32, Action<Barrier>)

Initializes a new instance of theBarrier class.

Barrier(Int32)

Initializes a new instance of theBarrier class.

Properties

CurrentPhaseNumber

Gets the number of the barrier's current phase.

ParticipantCount

Gets the total number of participants in the barrier.

ParticipantsRemaining

Gets the number of participants in the barrier that haven't yet signaled in the current phase.

Methods

AddParticipant()

Notifies theBarrier that there will be an additional participant.

AddParticipants(Int32)

Notifies theBarrier that there will be additional participants.

Dispose()

Releases all resources used by the current instance of theBarrier class.

Dispose(Boolean)

Releases the unmanaged resources used by theBarrier, and optionally releases the managed resources.

Equals(Object)

Determines whether the specified object is equal to the current object.

(Inherited fromObject)
GetHashCode()

Serves as the default hash function.

(Inherited fromObject)
GetType()

Gets theType of the current instance.

(Inherited fromObject)
MemberwiseClone()

Creates a shallow copy of the currentObject.

(Inherited fromObject)
RemoveParticipant()

Notifies theBarrier that there will be one less participant.

RemoveParticipants(Int32)

Notifies theBarrier that there will be fewer participants.

SignalAndWait()

Signals that a participant has reached the barrier and waits for all other participants to reach the barrier as well.

SignalAndWait(CancellationToken)

Signals that a participant has reached the barrier and waits for all other participants to reach the barrier, while observing a cancellation token.

SignalAndWait(Int32, CancellationToken)

Signals that a participant has reached the barrier and waits for all other participants to reach the barrier as well, using a 32-bit signed integer to measure the timeout, while observing a cancellation token.

SignalAndWait(Int32)

Signals that a participant has reached the barrier and waits for all other participants to reach the barrier as well, using a 32-bit signed integer to measure the timeout.

SignalAndWait(TimeSpan, CancellationToken)

Signals that a participant has reached the barrier and waits for all other participants to reach the barrier as well, using aTimeSpan object to measure the time interval, while observing a cancellation token.

SignalAndWait(TimeSpan)

Signals that a participant has reached the barrier and waits for all other participants to reach the barrier as well, using aTimeSpan object to measure the time interval.

ToString()

Returns a string that represents the current object.

(Inherited fromObject)

Applies to

Thread Safety

All public and protected members ofBarrier are thread-safe and may be used concurrently from multiple threads, with the exception of Dispose, which must only be used when all other operations on theBarrier have completed.

See also

Collaborate with us on GitHub
The source for this content can be found on GitHub, where you can also create and review issues and pull requests. For more information, seeour contributor guide.

Feedback

Was this page helpful?

YesNoNo

Need help with this topic?

Want to try using Ask Learn to clarify or guide you through this topic?

Suggest a fix?

In this article

Was this page helpful?

YesNo
NoNeed help with this topic?

Want to try using Ask Learn to clarify or guide you through this topic?

Suggest a fix?