Прочитать на английском

Поделиться через


Barrier Класс

Определение

Позволяет нескольким задачам параллельно работать с алгоритмом, используя несколько фаз.

public class Barrier : IDisposable
[System.Runtime.InteropServices.ComVisible(false)]
public class Barrier : IDisposable
Наследование
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();
    }
}

Комментарии

Группа задач сотрудничает путем перехода через ряд этапов, где каждый из них сигнализирует, что он прибыл на Barrier данном этапе и неявно ожидает прибытия всех остальных. Одно и то же Barrier можно использовать для нескольких этапов.

Конструкторы

Barrier(Int32)

Инициализирует новый экземпляр класса Barrier.

Barrier(Int32, Action<Barrier>)

Инициализирует новый экземпляр класса Barrier.

Свойства

CurrentPhaseNumber

Получает номер текущей фазы барьера.

ParticipantCount

Получает общее количество участников в барьере.

ParticipantsRemaining

Получает количество участников в барьере, которые еще не создали сигнал в текущей фазе.

Методы

AddParticipant()

Уведомляет Barrier о добавлении дополнительного участника.

AddParticipants(Int32)

Уведомляет барьер Barrier о добавлении дополнительных участников.

Dispose()

Освобождает все ресурсы, используемые текущим экземпляром класса Barrier.

Dispose(Boolean)

Освобождает неуправляемые ресурсы, используемые журналом Barrier, и при необходимости освобождает также управляемые ресурсы.

Equals(Object)

Определяет, равен ли указанный объект текущему объекту.

(Унаследовано от Object)
GetHashCode()

Служит хэш-функцией по умолчанию.

(Унаследовано от Object)
GetType()

Возвращает объект Type для текущего экземпляра.

(Унаследовано от Object)
MemberwiseClone()

Создает неполную копию текущего объекта Object.

(Унаследовано от Object)
RemoveParticipant()

Уведомляет Barrier о удалении одного участника.

RemoveParticipants(Int32)

Уведомляет барьер Barrier об удалении нескольких участников.

SignalAndWait()

Сообщает, что участник достиг барьера и ожидает достижения барьера другими участниками.

SignalAndWait(CancellationToken)

Сообщает, что участник достиг барьера и ожидает достижения барьера всеми другими участниками. Кроме того, метод контролирует токен отмены.

SignalAndWait(Int32)

Сообщает, что участник достиг барьера и ожидает достижения барьера всеми другими участниками, используя 32-разрядное знаковое целое число для измерения времени ожидания.

SignalAndWait(Int32, CancellationToken)

Сообщает, что участник достиг барьера и ожидает достижения барьера всеми другими участниками, используя 32-разрядное знаковое целое число для измерения времени ожидания. Кроме того, метод контролирует токен отмены.

SignalAndWait(TimeSpan)

Сообщает, что участник достиг барьера и ожидает достижения барьера всеми другими участниками, используя объект TimeSpan для измерения интервала времени.

SignalAndWait(TimeSpan, CancellationToken)

Сообщает, что участник достиг барьера и ожидает достижения барьера всеми другими участниками, используя объект TimeSpan для измерения интервала времени. Кроме того, метод контролирует токен отмены.

ToString()

Возвращает строку, представляющую текущий объект.

(Унаследовано от Object)

Применяется к

Потокобезопасность

Все открытые и защищенные элементы Barrier являются потокобезопасными и могут использоваться одновременно из нескольких потоков, за исключением Dispose, которые должны использоваться только после завершения всех остальных операций Barrier .

См. также раздел