SemaphoreFullException クラス
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
カウントが最大値に達しているセマフォで、Release メソッドが呼び出された場合にスローされる例外。
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
[<System.Runtime.InteropServices.ComVisible(false)>]
[<System.Serializable>]
type SemaphoreFullException = class
inherit SystemException
Public Class SemaphoreFullException
Inherits Exception
Public Class SemaphoreFullException
Inherits SystemException
- 継承
- 継承
- 属性
例
次のコード例は、あるスレッドのプログラミング エラーによって別のスレッドで が SemaphoreFullException 発生する方法を示しています。2 つのスレッドがセマフォに入ります。 2 番目のスレッドはセマフォを 2 回解放しますが、最初のスレッドは引き続きタスクを実行しています。 最初のスレッドが終了してセマフォを解放すると、セマフォの数は既にいっぱいになり、例外がスローされます。
#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.
'
注釈
セマフォのカウントは、スレッドがセマフォに入るたびにデクリメントされ、スレッドがセマフォを解放するとインクリメントされます。 カウントが 0 の場合、後続の要求は、他のスレッドがセマフォを解放するまでブロックします。 すべてのスレッドがセマフォを解放すると、セマフォの作成時に指定された最大値がカウントされます。 プログラミング エラーによってスレッドがこの時点で メソッドを Semaphore.Release 呼び出す場合は、 SemaphoreFullException がスローされます。
注意
クラスはSemaphore、 メソッドと Semaphore.Release メソッドの呼び出しにスレッド ID をWaitHandle.WaitOne適用しません。 を呼び出WaitOneReleaseすのと同じスレッドでは必要ありません。
SemaphoreFullException は、必ずしも例外が発生したコードに問題があることを示しているわけではありません。 次のシナリオを考えてみましょう。スレッド A とスレッド B は、最大カウントが 2 のセマフォを入力します。 スレッド B のプログラミング エラーにより、セマフォのカウントがいっぱいになるように 2 回呼び出 Release されます。 その結果、スレッド A が最終的に を呼び出 Releaseすと、 SemaphoreFullException がスローされます。
SemaphoreFullException クラスのインスタンスの初期プロパティ値一覧については、SemaphoreFullException() コンストラクターに関するトピックを参照してください。
コンストラクター
SemaphoreFullException() |
SemaphoreFullException クラスの新しいインスタンスを既定値で初期化します。 |
SemaphoreFullException(SerializationInfo, StreamingContext) |
シリアル化したデータを使用して、SemaphoreFullException クラスの新しいインスタンスを初期化します。 |
SemaphoreFullException(String) |
指定したエラー メッセージを使用して、SemaphoreFullException クラスの新しいインスタンスを初期化します。 |
SemaphoreFullException(String, Exception) |
指定したエラー メッセージおよびこの例外の原因となった内部例外への参照を使用して、SemaphoreFullException クラスの新しいインスタンスを初期化します。 |
プロパティ
Data |
例外に関する追加のユーザー定義情報を提供する、キーと値のペアのコレクションを取得します。 (継承元 Exception) |
HelpLink |
この例外に関連付けられているヘルプ ファイルへのリンクを取得または設定します。 (継承元 Exception) |
HResult |
特定の例外に割り当てられているコード化数値である HRESULT を取得または設定します。 (継承元 Exception) |
InnerException |
現在の例外の原因となる Exception インスタンスを取得します。 (継承元 Exception) |
Message |
現在の例外を説明するメッセージを取得します。 (継承元 Exception) |
Source |
エラーの原因となるアプリケーションまたはオブジェクトの名前を取得または設定します。 (継承元 Exception) |
StackTrace |
呼び出し履歴で直前のフレームの文字列形式を取得します。 (継承元 Exception) |
TargetSite |
現在の例外がスローされたメソッドを取得します。 (継承元 Exception) |
メソッド
Equals(Object) |
指定されたオブジェクトが現在のオブジェクトと等しいかどうかを判断します。 (継承元 Object) |
GetBaseException() |
派生クラスでオーバーライドされた場合、それ以後に発生する 1 つ以上の例外の根本原因である Exception を返します。 (継承元 Exception) |
GetHashCode() |
既定のハッシュ関数として機能します。 (継承元 Object) |
GetObjectData(SerializationInfo, StreamingContext) |
派生クラスでオーバーライドされた場合は、その例外に関する情報を使用して SerializationInfo を設定します。 (継承元 Exception) |
GetType() |
現在のインスタンスのランタイム型を取得します。 (継承元 Exception) |
MemberwiseClone() |
現在の Object の簡易コピーを作成します。 (継承元 Object) |
ToString() |
現在の例外の文字列形式を作成して返します。 (継承元 Exception) |
イベント
SerializeObjectState |
古い.
例外がシリアル化され、例外に関するシリアル化されたデータを含む例外状態オブジェクトが作成されたときに発生します。 (継承元 Exception) |