SemaphoreFullException Klasse

Definition

Die Ausnahme, die ausgelöst wird, wenn die Release-Methode für ein Semaphor aufgerufen wird, dessen Zähler bereits den Maximalwert aufweist.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 : Exception
public ref class SemaphoreFullException : SystemException
public class SemaphoreFullException : Exception
public class SemaphoreFullException : SystemException
[System.Runtime.InteropServices.ComVisible(false)]
[System.Serializable]
public class SemaphoreFullException : SystemException
type SemaphoreFullException = class
    inherit Exception
type SemaphoreFullException = class
    inherit SystemException
Public Class SemaphoreFullException
Inherits Exception
Public Class SemaphoreFullException
Inherits SystemException
Vererbung
SemaphoreFullException
Vererbung
SemaphoreFullException
Attribute

Beispiele

Im folgenden Codebeispiel wird veranschaulicht, wie ein Programmierfehler in einem Thread zu einer SemaphoreFullException in einem anderen Thread führen kann: zwei Threads geben ein Semaphor ein.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. Der zweite Thread gibt das Semaphor zweimal frei, während der erste Thread noch seinen Task ausführt.The second thread releases the semaphore twice, while the first thread is still executing its task. Wenn der erste Thread abgeschlossen ist und das Semaphor freigibt, ist die Anzahl der Semaphor bereits voll, und es wird eine Ausnahme ausgelöst.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.
'

Hinweise

Die Anzahl in einem Semaphor wird jedes Mal dekrementiert, wenn ein Thread in das Semaphor eintritt, und erhöht sich, wenn ein Thread das Semaphor freigibt.The count on a semaphore is decremented each time a thread enters the semaphore, and incremented when a thread releases the semaphore. Wenn die Anzahl 0 (null) ist, werden nachfolgende Anforderungen blockiert, bis andere Threads das Semaphor freigeben.When the count is zero, subsequent requests block until other threads release the semaphore. Wenn alle Threads das Semaphor freigegeben haben, liegt die Anzahl bei dem maximalen Wert, der beim Erstellen des Semaphors angegeben wurde.When all threads have released the semaphore, the count is at the maximum value specified when the semaphore was created. Wenn ein Programmierfehler bewirkt, dass ein Thread an dieser Stelle die Semaphore.Release-Methode aufruft, wird eine SemaphoreFullException ausgelöst.If a programming error causes a thread to call the Semaphore.Release method at this point, a SemaphoreFullException is thrown.

Hinweis

Die Semaphore-Klasse erzwingt keine Thread Identität bei Aufrufen der Methoden WaitHandle.WaitOne und Semaphore.Release.The Semaphore class does not enforce thread identity on calls to the WaitHandle.WaitOne and Semaphore.Release methods. Es ist nicht erforderlich, dass derselbe Thread, der WaitOne aufgerufen hat, Releaseaufruft.It is not necessary for the same thread that called WaitOne to call Release.

SemaphoreFullException weist nicht notwendigerweise auf ein Problem mit dem Code hin, bei dem die Ausnahme aufgetreten ist.SemaphoreFullException does not necessarily indicate a problem with the code where the exception occurred. Betrachten Sie das folgende Szenario: Thread A und Thread B geben ein Semaphor ein, das eine maximale Anzahl von zwei hat.Consider the following scenario: Thread A and thread B enter a semaphore that has a maximum count of two. Ein Programmierfehler in Thread B bewirkt, dass Release zweimal aufruft, damit die Anzahl der Semaphor voll ist.A programming error in thread B causes it to call Release twice, so that the count on the semaphore is full. Wenn Thread a schließlich Releaseaufruft, wird eine SemaphoreFullException ausgelöst.As a result, when thread A eventually calls Release, a SemaphoreFullException is thrown.

Eine Liste der anfänglichen Eigenschaftenwerte für eine Instanz der SemaphoreFullException-Klasse finden Sie im SemaphoreFullException()-Konstruktor.For a list of initial property values for an instance of the SemaphoreFullException class, see the SemaphoreFullException() constructor.

Konstruktoren

SemaphoreFullException()

Initialisiert eine neue Instanz der SemaphoreFullException-Klasse mit Standardwerten.Initializes a new instance of the SemaphoreFullException class with default values.

SemaphoreFullException(SerializationInfo, StreamingContext)

Initialisiert eine neue Instanz der SemaphoreFullException-Klasse mit serialisierten Daten.Initializes a new instance of the SemaphoreFullException class with serialized data.

SemaphoreFullException(String)

Initialisiert eine neue Instanz der SemaphoreFullException-Klasse mit einer angegebenen Fehlermeldung.Initializes a new instance of the SemaphoreFullException class with a specified error message.

SemaphoreFullException(String, Exception)

Initialisiert eine neue Instanz der SemaphoreFullException-Klasse mit einer angegebenen Fehlermeldung und einem Verweis auf die innere Ausnahme, die die Ursache für diese Ausnahme bildet.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.

Eigenschaften

Data

Ruft eine Auflistung von Schlüssel-Wert-Paaren ab, die zusätzliche benutzerdefinierte Informationen über die Ausnahme bereitstellen.Gets a collection of key/value pairs that provide additional user-defined information about the exception.

(Geerbt von Exception)
HelpLink

Ruft einen Link zur Hilfedatei ab, die dieser Ausnahme zugeordnet ist, oder legt einen Link fest.Gets or sets a link to the help file associated with this exception.

(Geerbt von Exception)
HResult

Ruft HRESULT ab oder legt HRESULT fest. Dies ist ein codierter Wert, der einer bestimmten Ausnahme zugeordnet ist.Gets or sets HRESULT, a coded numerical value that is assigned to a specific exception.

(Geerbt von Exception)
InnerException

Ruft die Exception-Instanz ab, die die aktuelle Ausnahme verursacht hat.Gets the Exception instance that caused the current exception.

(Geerbt von Exception)
Message

Ruft eine Meldung ab, die die aktuelle Ausnahme beschreibt.Gets a message that describes the current exception.

(Geerbt von Exception)
Source

Gibt den Namen der Anwendung oder des Objekts zurück, die bzw. das den Fehler verursacht hat, oder legt diesen fest.Gets or sets the name of the application or the object that causes the error.

(Geerbt von Exception)
StackTrace

Ruft eine Zeichenfolgendarstellung der unmittelbaren Frames in der Aufrufliste ab.Gets a string representation of the immediate frames on the call stack.

(Geerbt von Exception)
TargetSite

Ruft die Methode ab, die die aktuelle Ausnahme auslöst.Gets the method that throws the current exception.

(Geerbt von Exception)

Methoden

Equals(Object)

Bestimmt, ob das angegebene Objekt gleich dem aktuellen Objekt ist.Determines whether the specified object is equal to the current object.

(Geerbt von Object)
GetBaseException()

Gibt beim Überschreiben in einer abgeleiteten Klasse eine Exception zurück, die die Grundursache für eine oder mehrere nachfolgende Ausnahmen ist.When overridden in a derived class, returns the Exception that is the root cause of one or more subsequent exceptions.

(Geerbt von Exception)
GetHashCode()

Dient als die Standard-HashfunktionServes as the default hash function.

(Geerbt von Object)
GetObjectData(SerializationInfo, StreamingContext)

Legt beim Überschreiben in einer abgeleiteten Klasse die SerializationInfo mit Informationen über die Ausnahme fest.When overridden in a derived class, sets the SerializationInfo with information about the exception.

(Geerbt von Exception)
GetType()

Ruft den Laufzeittyp der aktuellen Instanz ab.Gets the runtime type of the current instance.

(Geerbt von Exception)
MemberwiseClone()

Erstellt eine flache Kopie des aktuellen Object.Creates a shallow copy of the current Object.

(Geerbt von Object)
ToString()

Erstellt eine Zeichenfolgendarstellung der aktuellen Ausnahme und gibt diese zurück.Creates and returns a string representation of the current exception.

(Geerbt von Exception)

Ereignisse

SerializeObjectState

Tritt auf, wenn eine Ausnahme serialisiert wird, um ein Ausnahmezustandsobjekt mit serialisierten Daten über die Ausnahme zu erstellen.Occurs when an exception is serialized to create an exception state object that contains serialized data about the exception.

(Geerbt von Exception)

Gilt für:

Siehe auch