SemaphoreFullException SemaphoreFullException SemaphoreFullException SemaphoreFullException Class

定義

カウントが既に最大値であるセマフォに対して 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
継承
SemaphoreFullExceptionSemaphoreFullExceptionSemaphoreFullExceptionSemaphoreFullException
属性

次のコード例では、あるスレッドでのプログラミングエラーが別のSemaphoreFullExceptionスレッドのにつながる可能性があることを示しています。2つのスレッドがセマフォを入力します。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. 2番目のスレッドは、最初のスレッドがそのタスクを実行している間に、セマフォを2回解放します。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.

注意

クラスSemaphoreは、メソッドおよびSemaphore.ReleaseメソッドのWaitHandle.WaitOne呼び出しにスレッド id を適用しません。The 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 は、最大数が2のセマフォを入力します。Consider the following scenario: Thread A and thread B enter a semaphore that has a maximum count of two. スレッド B のプログラミングエラーによって、セマフォReleaseのカウントがいっぱいになるように、が2回呼び出されるようになります。A programming error in thread B causes it to call Release twice, so that the count on the semaphore is full. その結果、スレッド a 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() SemaphoreFullException() SemaphoreFullException()

SemaphoreFullException クラスの新しいインスタンスを既定値で初期化します。Initializes a new instance of the SemaphoreFullException class with default values.

SemaphoreFullException(SerializationInfo, StreamingContext) SemaphoreFullException(SerializationInfo, StreamingContext) SemaphoreFullException(SerializationInfo, StreamingContext) SemaphoreFullException(SerializationInfo, StreamingContext)

シリアル化したデータを使用して、SemaphoreFullException クラスの新しいインスタンスを初期化します。Initializes a new instance of the SemaphoreFullException class with serialized data.

SemaphoreFullException(String) SemaphoreFullException(String) SemaphoreFullException(String) SemaphoreFullException(String)

指定したエラー メッセージを使用して、SemaphoreFullException クラスの新しいインスタンスを初期化します。Initializes a new instance of the SemaphoreFullException class with a specified error message.

SemaphoreFullException(String, Exception) SemaphoreFullException(String, Exception) SemaphoreFullException(String, Exception) 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 Data Data Data

例外に関する追加のユーザー定義情報を提供する、キー/値ペアのコレクションを取得します。Gets a collection of key/value pairs that provide additional user-defined information about the exception.

(Inherited from Exception)
HelpLink HelpLink HelpLink HelpLink

この例外に関連付けられているヘルプ ファイルへのリンクを取得または設定します。Gets or sets a link to the help file associated with this exception.

(Inherited from Exception)
HResult HResult HResult HResult

特定の例外に割り当てられているコード化数値である HRESULT を取得または設定します。Gets or sets HRESULT, a coded numerical value that is assigned to a specific exception.

(Inherited from Exception)
InnerException InnerException InnerException InnerException

現在の例外の原因となる Exception インスタンスを取得します。Gets the Exception instance that caused the current exception.

(Inherited from Exception)
Message Message Message Message

現在の例外を説明するメッセージを取得します。Gets a message that describes the current exception.

(Inherited from Exception)
Source Source Source Source

エラーの原因となるアプリケーションまたはオブジェクトの名前を取得または設定します。Gets or sets the name of the application or the object that causes the error.

(Inherited from Exception)
StackTrace StackTrace StackTrace StackTrace

呼び出し履歴で直前のフレームの文字列形式を取得します。Gets a string representation of the immediate frames on the call stack.

(Inherited from Exception)
TargetSite TargetSite TargetSite TargetSite

現在の例外がスローされたメソッドを取得します。Gets the method that throws the current exception.

(Inherited from Exception)

メソッド

Equals(Object) Equals(Object) Equals(Object) Equals(Object)

指定したオブジェクトが、現在のオブジェクトと等しいかどうかを判断します。Determines whether the specified object is equal to the current object.

(Inherited from Object)
GetBaseException() GetBaseException() GetBaseException() GetBaseException()

派生クラスでオーバーライドされた場合、それ以後に発生する 1 つ以上の例外の主要な原因である Exception を返します。When overridden in a derived class, returns the Exception that is the root cause of one or more subsequent exceptions.

(Inherited from Exception)
GetHashCode() GetHashCode() GetHashCode() GetHashCode()

既定のハッシュ関数として機能します。Serves as the default hash function.

(Inherited from Object)
GetObjectData(SerializationInfo, StreamingContext) GetObjectData(SerializationInfo, StreamingContext) GetObjectData(SerializationInfo, StreamingContext) GetObjectData(SerializationInfo, StreamingContext)

派生クラスでオーバーライドされた場合は、その例外に関する情報を使用して SerializationInfo を設定します。When overridden in a derived class, sets the SerializationInfo with information about the exception.

(Inherited from Exception)
GetType() GetType() GetType() GetType()

現在のインスタンスのランタイム型を取得します。Gets the runtime type of the current instance.

(Inherited from Exception)
MemberwiseClone() MemberwiseClone() MemberwiseClone() MemberwiseClone()

現在の Object の簡易コピーを作成します。Creates a shallow copy of the current Object.

(Inherited from Object)
ToString() ToString() ToString() ToString()

現在の例外の文字列形式を作成して返します。Creates and returns a string representation of the current exception.

(Inherited from Exception)

イベント

SerializeObjectState SerializeObjectState SerializeObjectState SerializeObjectState

例外がシリアル化され、例外に関するシリアル化されたデータを含む例外状態オブジェクトが作成されたときに発生します。Occurs when an exception is serialized to create an exception state object that contains serialized data about the exception.

(Inherited from Exception)

適用対象

こちらもご覧ください