SemaphoreFullException Classe

Definição

A exceção é lançada quando o Release método é chamado a um semáforo cuja contagem já está no máximo.

public ref class SemaphoreFullException : Exception
public ref class SemaphoreFullException : SystemException
public class SemaphoreFullException : Exception
[System.Runtime.InteropServices.ComVisible(false)]
[System.Serializable]
public class SemaphoreFullException : SystemException
public class SemaphoreFullException : SystemException
type SemaphoreFullException = class
    inherit Exception
[<System.Runtime.InteropServices.ComVisible(false)>]
[<System.Serializable>]
type SemaphoreFullException = class
    inherit SystemException
type SemaphoreFullException = class
    inherit SystemException
Public Class SemaphoreFullException
Inherits Exception
Public Class SemaphoreFullException
Inherits SystemException
Herança
SemaphoreFullException
Herança
SemaphoreFullException
Atributos

Exemplos

O exemplo de código seguinte mostra como um erro de programação numa thread pode levar a a SemaphoreFullException noutra thread: Duas threads entram num semáforo. O segundo thread liberta o semáforo duas vezes, enquanto o primeiro thread ainda está a executar a sua tarefa. Quando o primeiro fio termina e liberta o semáforo, a contagem de semáforos já está cheia e é lançada uma exceção.

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.
'

Observações

A contagem num semáforo é decrementada cada vez que um fio entra no semáforo, e incrementada quando um fio liberta o semáforo. Quando a contagem é zero, os pedidos subsequentes bloqueiam até que outros threads libertem o semáforo. Quando todas as threads libertam o semáforo, a contagem está no valor máximo especificado quando o semáforo foi criado. Se um erro de programação fizer com que um thread chame o Semaphore.Release método neste ponto, um SemaphoreFullException é lançado.

Note

A Semaphore classe não impõe a identidade do thread nas chamadas aos WaitHandle.WaitOne métodos e.Semaphore.Release Não é necessário que o mesmo thread que chamou WaitOne chame Release.

SemaphoreFullException não indica necessariamente um problema com o código onde ocorreu a exceção. Considere o seguinte cenário: O fio A e o fio B entram num semáforo que tem uma contagem máxima de dois. Um erro de programação na thread B faz com que chame Release duas vezes, de modo que a contagem no semáforo fica completa. Como resultado, quando o fio A eventualmente chama Release, a SemaphoreFullException é lançado.

Para uma lista de valores iniciais de propriedades para uma instância da SemaphoreFullException classe, veja o SemaphoreFullException() construtor.

Construtores

Name Description
SemaphoreFullException()

Inicializa uma nova instância da SemaphoreFullException classe com valores por defeito.

SemaphoreFullException(SerializationInfo, StreamingContext)

Inicializa uma nova instância da SemaphoreFullException classe com dados serializados.

SemaphoreFullException(String, Exception)

Inicializa uma nova instância da SemaphoreFullException classe com uma mensagem de erro especificada e uma referência à exceção interna que é a causa dessa exceção.

SemaphoreFullException(String)

Inicializa uma nova instância da SemaphoreFullException classe com uma mensagem de erro especificada.

Propriedades

Name Description
Data

Obtém uma coleção de pares chave/valor que fornecem informação adicional definida pelo utilizador sobre a exceção.

(Herdado de Exception)
HelpLink

Obtém ou define um link para o ficheiro de ajuda associado a esta exceção.

(Herdado de Exception)
HResult

Recebe ou define HRESULT, um valor numérico codificado atribuído a uma exceção específica.

(Herdado de Exception)
InnerException

Obtém a Exception instância que causou a exceção atual.

(Herdado de Exception)
Message

Recebe uma mensagem que descreve a exceção atual.

(Herdado de Exception)
Source

Obtém ou define o nome do aplicativo ou o objeto que causa o erro.

(Herdado de Exception)
StackTrace

Obtém uma representação string dos frames imediatos na stack de chamadas.

(Herdado de Exception)
TargetSite

Obtém o método que lança a exceção atual.

(Herdado de Exception)

Métodos

Name Description
Equals(Object)

Determina se o objeto especificado é igual ao objeto atual.

(Herdado de Object)
GetBaseException()

Quando sobrescrito numa classe derivada, devolve o Exception que é a causa raiz de uma ou mais exceções subsequentes.

(Herdado de Exception)
GetHashCode()

Serve como função de hash predefinida.

(Herdado de Object)
GetObjectData(SerializationInfo, StreamingContext)

Quando sobreposto numa classe derivada, define a SerializationInfo informação com sobre a exceção.

(Herdado de Exception)
GetType()

Obtém o tipo de execução da instância atual.

(Herdado de Exception)
MemberwiseClone()

Cria uma cópia superficial do atual Object.

(Herdado de Object)
ToString()

Cria e devolve uma representação string da exceção atual.

(Herdado de Exception)

evento

Name Description
SerializeObjectState

Ocorre quando uma exceção é serializada para criar um objeto de estado de exceção que contém dados serializados sobre a exceção.

(Herdado de Exception)

Aplica-se a

Ver também