Barrier Sınıf

Tanım

Birden çok görevi birden çok aşamada paralel olarak bir algoritma üzerinde birlikte çalışmasını sağlar.

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
Devralma
Barrier
Öznitelikler
Uygulamalar

Örnekler

Aşağıdaki örnekte bir engelin nasıl kullanılacağı gösterilmektedir:

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

Açıklamalar

Bir görev grubu, gruptaki her birinin belirli bir aşamada ulaştığını Barrier ve diğer tüm kişilerin gelmesini örtük olarak beklediği bir dizi aşamada birlikte çalışır. Barrier Aynı şey birden çok aşama için de kullanılabilir.

Oluşturucular

Barrier(Int32)

Barrier sınıfının yeni bir örneğini başlatır.

Barrier(Int32, Action<Barrier>)

Barrier sınıfının yeni bir örneğini başlatır.

Özellikler

CurrentPhaseNumber

Bariyerin geçerli aşamasının sayısını alır.

ParticipantCount

Engeldeki toplam katılımcı sayısını alır.

ParticipantsRemaining

Geçerli aşamada henüz işaretlenmemiş olan engeldeki katılımcı sayısını alır.

Yöntemler

AddParticipant()

Barrier Ek katılımcı olacağını bildirir.

AddParticipants(Int32)

Barrier Ek katılımcıların olacağını bildirir.

Dispose()

Barrier sınıfının geçerli örneği tarafından kullanılan tüm kaynakları serbest bırakır.

Dispose(Boolean)

tarafından Barrierkullanılan yönetilmeyen kaynakları serbest bırakır ve isteğe bağlı olarak yönetilen kaynakları serbest bırakır.

Equals(Object)

Belirtilen nesnenin geçerli nesneye eşit olup olmadığını belirler.

(Devralındığı yer: Object)
GetHashCode()

Varsayılan karma işlevi işlevi görür.

(Devralındığı yer: Object)
GetType()

Type Geçerli örneğini alır.

(Devralındığı yer: Object)
MemberwiseClone()

Geçerli Objectöğesinin sığ bir kopyasını oluşturur.

(Devralındığı yer: Object)
RemoveParticipant()

Barrier Bir katılımcının daha az olacağını bildirir.

RemoveParticipants(Int32)

Barrier Daha az katılımcı olacağını bildirir.

SignalAndWait()

Bir katılımcının bariyere ulaştığını ve diğer tüm katılımcıların da bariyere ulaşmasını beklediğine dair sinyaller.

SignalAndWait(CancellationToken)

Bir katılımcının engele ulaştığını ve bir iptal belirtecini gözlemlerken diğer tüm katılımcıların engele ulaşmasını beklediğine dair sinyaller.

SignalAndWait(Int32)

Bir katılımcının engele ulaştığını ve zaman aşımını ölçmek için 32 bit imzalı bir tamsayı kullanarak diğer tüm katılımcıların da bariyere ulaşmasını beklediğine dair sinyaller.

SignalAndWait(Int32, CancellationToken)

Bir katılımcının engele ulaştığını ve bir iptal belirtecini gözlemlerken zaman aşımını ölçmek için 32 bit imzalı bir tamsayı kullanarak diğer tüm katılımcıların da bariyere ulaşmasını beklediğine dair sinyaller.

SignalAndWait(TimeSpan)

Bir katılımcının bariyere ulaştığını ve zaman aralığını ölçmek için bir TimeSpan nesne kullanarak diğer tüm katılımcıların da bariyere ulaşmasını beklediğini gösterir.

SignalAndWait(TimeSpan, CancellationToken)

Bir katılımcının engele ulaştığını ve bir iptal belirtecini gözlemlerken zaman aralığını ölçmek için bir TimeSpan nesne kullanarak diğer tüm katılımcıların da bariyere ulaşmasını beklediğine dair sinyaller.

ToString()

Geçerli nesneyi temsil eden dizeyi döndürür.

(Devralındığı yer: Object)

Şunlara uygulanır

İş Parçacığı Güvenliği

tüm ortak ve korumalı üyeleri Barrier iş parçacığı güvenlidir ve yalnızca üzerindeki Barrier diğer tüm işlemler tamamlandığında kullanılması gereken Dispose dışında birden çok iş parçacığından eşzamanlı olarak kullanılabilir.

Ayrıca bkz.