SemaphoreFullException Класс

Определение

Исключение, выдаваемое при вызове метода Release для семафора, значение счетчика которого уже равно максимальному.The exception that is thrown when the Release method is called on a semaphore whose count is already at the maximum.

public ref class SemaphoreFullException : SystemException
[System.Runtime.InteropServices.ComVisible(false)]
[System.Serializable]
public class SemaphoreFullException : SystemException
type SemaphoreFullException = class
    inherit SystemException
Public Class SemaphoreFullException
Inherits SystemException
Наследование
SemaphoreFullException
Атрибуты

Примеры

В следующем примере кода показано, SemaphoreFullException как ошибка программирования в одном потоке может привести к вызову в другом потоке: Два потока вводят семафор.The following code example shows how a programming error in one thread can lead to a SemaphoreFullException in another thread: Two threads enter a semaphore. Второй поток освобождает семафор дважды, в то время как первый поток все еще исполняет свою задачу.The second thread releases the semaphore twice, while the first thread is still executing its task. Когда первый поток завершается и освобождает семафор, число семафоров уже заполнено и выдается исключение.When the first thread finishes and releases the semaphore, the semaphore count is already full and an exception is thrown.

#using <System.dll>
using namespace System;
using namespace System::Threading;

public ref class Example
{
private:
   // A semaphore that can satisfy at most two concurrent
   // requests.
   //
   static Semaphore^ _pool = gcnew Semaphore( 2,2 );

public:
   static void main()
   {
      // Create and start two threads, A and B.
      //
      Thread^ tA = gcnew Thread( gcnew ThreadStart( ThreadA ) );
      tA->Start();

      Thread^ tB = gcnew Thread( gcnew ThreadStart( ThreadB ) );
      tB->Start();
   }

private:
   static void ThreadA()
   {
      // Thread A enters the semaphore and simulates a task
      // that lasts a second.
      //
      _pool->WaitOne();
      Console::WriteLine( L"Thread A entered the semaphore." );

      Thread::Sleep( 1000 );

      try
      {
         _pool->Release();
         Console::WriteLine( L"Thread A released the semaphore." );
      }
      catch ( Exception^ ex ) 
      {
         Console::WriteLine( L"Thread A: {0}", ex->Message );
      }
   }

   static void ThreadB()
   {
      // Thread B simulates a task that lasts half a second,
      // then enters the semaphore.
      //
      Thread::Sleep( 500 );

      _pool->WaitOne();
      Console::WriteLine( L"Thread B entered the semaphore." );
      
      // Due to a programming error, Thread B releases the
      // semaphore twice. To fix the program, delete one line.
      _pool->Release();
      _pool->Release();
      Console::WriteLine( L"Thread B exits successfully." );
   }
};
/* This code example produces the following output:

Thread A entered the semaphore.
Thread B entered the semaphore.
Thread B exits successfully.
Thread A: Adding the given count to the semaphore would cause it to exceed its maximum count.
 */
using System;
using System.Threading;

public class Example
{
    // A semaphore that can satisfy at most two concurrent
    // requests.
    //
    private static Semaphore _pool = new Semaphore(2, 2);

    public static void Main()
    {
        // Create and start two threads, A and B. 
        //
        Thread tA = new Thread(new ThreadStart(ThreadA));
        tA.Start();

        Thread tB = new Thread(new ThreadStart(ThreadB));
        tB.Start();
    }

    private static void ThreadA()
    {
        // Thread A enters the semaphore and simulates a task
        // that lasts a second.
        //
        _pool.WaitOne();
        Console.WriteLine("Thread A entered the semaphore.");

        Thread.Sleep(1000);

        try
        {
            _pool.Release();
            Console.WriteLine("Thread A released the semaphore.");
        }
        catch(Exception ex)
        {
            Console.WriteLine("Thread A: {0}", ex.Message);
        }
    }

    private static void ThreadB()
    {
        // Thread B simulates a task that lasts half a second,
        // then enters the semaphore.
        //
        Thread.Sleep(500);

        _pool.WaitOne();
        Console.WriteLine("Thread B entered the semaphore.");
        
        // Due to a programming error, Thread B releases the
        // semaphore twice. To fix the program, delete one line.
        _pool.Release();
        _pool.Release();
        Console.WriteLine("Thread B exits successfully.");
    }
}
/* This code example produces the following output:

Thread A entered the semaphore.
Thread B entered the semaphore.
Thread B exits successfully.
Thread A: Adding the given count to the semaphore would cause it to exceed its maximum count.
 */
Imports System.Threading

Public Class Example

    ' A semaphore that can satisfy at most two concurrent
    ' requests.
    '
    Private Shared _pool As New Semaphore(2, 2)

    <MTAThread> _
    Public Shared Sub Main()
        ' Create and start two threads, A and B. 
        '
        Dim tA As New Thread(AddressOf ThreadA)
        tA.Start()

        Dim tB As New Thread(AddressOf ThreadB)
        tB.Start()

    End Sub

    Private Shared Sub ThreadA()
        ' Thread A enters the semaphore and simulates a task
        ' that lasts a second.
        '
        _pool.WaitOne()
        Console.WriteLine("Thread A entered the semaphore.")

        Thread.Sleep(1000)

        Try
            _pool.Release()
            Console.WriteLine("Thread A released the semaphore.")
        Catch ex As Exception
            Console.WriteLine("Thread A: {0}", ex.Message)
        End Try
    End Sub

    Private Shared Sub ThreadB()
        ' Thread B simulates a task that lasts half a second,
        ' then enters the semaphore.
        '
        Thread.Sleep(500)

        _pool.WaitOne()
        Console.WriteLine("Thread B entered the semaphore.")
        
        ' Due to a programming error, Thread B releases the
        ' semaphore twice. To fix the program, delete one line.
        _pool.Release()
        _pool.Release()
        Console.WriteLine("Thread B exits successfully.")
    End Sub
End Class
' This code example produces the following output:
'
' Thread A entered the semaphore.
' Thread B entered the semaphore.
' Thread B exits successfully.
' Thread A: Adding the given count to the semaphore would cause it to exceed its maximum count.
'

Комментарии

Счетчик для семафора уменьшается каждый раз, когда поток входит в семафор, и увеличивается, когда поток освобождает семафор.The count on a semaphore is decremented each time a thread enters the semaphore, and incremented when a thread releases the semaphore. Если значение счетчика равно нулю, последующие запросы блокируются до освобождения семафора другими потоками.When the count is zero, subsequent requests block until other threads release the semaphore. Когда семафор освобожден всеми потоками, счетчик будет иметь максимальное значение, указанное при создании семафора.When all threads have released the semaphore, the count is at the maximum value specified when the semaphore was created. Если при возникновении ошибки программирования поток Semaphore.Release вызывает метод на этом этапе SemaphoreFullException , создается исключение.If a programming error causes a thread to call the Semaphore.Release method at this point, a SemaphoreFullException is thrown.

Примечание

Класс не применяет удостоверение потока при вызовах WaitHandle.WaitOne методов Semaphore.Releaseи. SemaphoreThe Semaphore class does not enforce thread identity on calls to the WaitHandle.WaitOne and Semaphore.Release methods. Не требуется для того же потока, который вызывал WaitOne Releaseметод.It is not necessary for the same thread that called WaitOne to call Release.

SemaphoreFullExceptionне обязательно указывает на проблему с кодом, в котором возникло исключение.SemaphoreFullException does not necessarily indicate a problem with the code where the exception occurred. Рассмотрим следующий сценарий. Поток A и поток B. Введите семафор с максимальным числом двух.Consider the following scenario: Thread A and thread B enter a semaphore that has a maximum count of two. Ошибка программирования в потоке B приводит к Release тому, что он вызывается дважды, чтобы счетчик в семафоре был заполнен.A programming error in thread B causes it to call Release twice, so that the count on the semaphore is full. В результате, когда поток а в конечном итоге вызывает Release SemaphoreFullException , создается исключение.As a result, when thread A eventually calls Release, a SemaphoreFullException is thrown.

Список начальных значений свойств для экземпляра класса SemaphoreFullException см. в описании конструктора SemaphoreFullException().For a list of initial property values for an instance of the SemaphoreFullException class, see the SemaphoreFullException() constructor.

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

SemaphoreFullException()

Инициализирует новый экземпляр класса SemaphoreFullException со значениями по умолчанию.Initializes a new instance of the SemaphoreFullException class with default values.

SemaphoreFullException(SerializationInfo, StreamingContext)

Инициализирует новый экземпляр класса SemaphoreFullException с сериализованными данными.Initializes a new instance of the SemaphoreFullException class with serialized data.

SemaphoreFullException(String)

Инициализирует новый экземпляр класса SemaphoreFullException с указанным сообщением об ошибке.Initializes a new instance of the SemaphoreFullException class with a specified error message.

SemaphoreFullException(String, Exception)

Инициализирует новый экземпляр класса SemaphoreFullException указанным сообщением об ошибке и ссылкой на внутреннее исключение, вызвавшее данное исключение.Initializes a new instance of the SemaphoreFullException class with a specified error message and a reference to the inner exception that is the cause of this exception.

Свойства

Data

Возвращает коллекцию пар ключ/значение, предоставляющие дополнительные сведения об исключении, определяемые пользователем.Gets a collection of key/value pairs that provide additional user-defined information about the exception.

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

Получает или задает ссылку на файл справки, связанный с этим исключением.Gets or sets a link to the help file associated with this exception.

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

Возвращает или задает HRESULT — кодированное числовое значение, присвоенное определенному исключению.Gets or sets HRESULT, a coded numerical value that is assigned to a specific exception.

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

Возвращает экземпляр класса Exception, который вызвал текущее исключение.Gets the Exception instance that caused the current exception.

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

Возвращает сообщение, описывающее текущее исключение.Gets a message that describes the current exception.

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

Возвращает или задает имя приложения или объекта, вызывавшего ошибку.Gets or sets the name of the application or the object that causes the error.

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

Получает строковое представление непосредственных кадров в стеке вызова.Gets a string representation of the immediate frames on the call stack.

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

Возвращает метод, создавший текущее исключение.Gets the method that throws the current exception.

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

Методы

Equals(Object)

Определяет, равен ли заданный объект текущему объекту.Determines whether the specified object is equal to the current object.

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

При переопределении в производном классе возвращает исключение Exception, которое является корневой причиной одного или нескольких последующих исключений.When overridden in a derived class, returns the Exception that is the root cause of one or more subsequent exceptions.

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

Служит хэш-функцией по умолчанию.Serves as the default hash function.

(Унаследовано от Object)
GetObjectData(SerializationInfo, StreamingContext)

При переопределении в производном классе задает сведения об исключении для SerializationInfo.When overridden in a derived class, sets the SerializationInfo with information about the exception.

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

Возвращает тип среды выполнения текущего экземпляра.Gets the runtime type of the current instance.

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

Создает неполную копию текущего объекта Object.Creates a shallow copy of the current Object.

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

Создает и возвращает строковое представление текущего исключения.Creates and returns a string representation of the current exception.

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

События

SerializeObjectState

Возникает, когда исключение сериализовано для создания объекта состояния исключения, содержащего сериализованные данные об исключении.Occurs when an exception is serialized to create an exception state object that contains serialized data about the exception.

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

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

Дополнительно