Barrier Класс
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Позволяет нескольким задачам совместно работать над алгоритмом параллельно с несколькими этапами.
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
- Наследование
-
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.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
Комментарии
Группа задач сотрудничает путем перехода через ряд этапов, где каждая из групп сигнализирует, что она прибыла на Barrier данный этап и неявно ожидает, пока все остальные будут прибыть. Одно и то же Barrier можно использовать для нескольких этапов.
Конструкторы
| Имя | Описание |
|---|---|
| Barrier(Int32, Action<Barrier>) |
Инициализирует новый экземпляр класса Barrier. |
| Barrier(Int32) |
Инициализирует новый экземпляр класса 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, CancellationToken) |
Сигнализирует о том, что участник достиг барьера и ожидает, чтобы все остальные участники достигли барьера, используя 32-разрядное целое число со знаком для измерения времени ожидания, наблюдая маркер отмены. |
| SignalAndWait(Int32) |
Сигнализирует о том, что участник достиг барьера и ожидает, чтобы все остальные участники достигли барьера, используя 32-разрядное целое число со знаком для измерения времени ожидания. |
| SignalAndWait(TimeSpan, CancellationToken) |
Сигнализирует о том, что участник достиг барьера и ожидает, чтобы все остальные участники достигли барьера, используя TimeSpan объект для измерения интервала времени, наблюдая маркер отмены. |
| SignalAndWait(TimeSpan) |
Сообщает, что участник достиг барьера и ожидает, чтобы все остальные участники достигли барьера, используя TimeSpan объект для измерения интервала времени. |
| ToString() |
Возвращает строку, представляющую текущий объект. (Унаследовано от Object) |
Применяется к
Потокобезопасность
Все общедоступные и защищенные члены Barrier являются потокобезопасными и могут использоваться одновременно из нескольких потоков, за исключением Dispose, которые должны использоваться только при завершении всех других операций.Barrier