ApartmentState 列挙型
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
Thread のアパートメント状態を指定します。
public enum class ApartmentState
public enum ApartmentState
[System.Serializable]
public enum ApartmentState
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public enum ApartmentState
type ApartmentState =
[<System.Serializable>]
type ApartmentState =
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type ApartmentState =
Public Enum ApartmentState
- 継承
- 属性
フィールド
MTA | 1 | Thread は、マルチスレッド アパートメントを作成および入力します。 |
STA | 0 | Thread は、シングルスレッド アパートメントを作成および入力します。 |
Unknown | 2 | ApartmentState プロパティが設定されていません。 |
例
次のコード例は、スレッドのアパートメント状態を設定する方法を示しています。
using namespace System;
using namespace System::Threading;
ref class ApartmentTest
{
public:
static void ThreadMethod()
{
Thread::Sleep( 1000 );
}
};
int main()
{
Thread^ newThread = gcnew Thread( gcnew ThreadStart( &ApartmentTest::ThreadMethod ) );
newThread->SetApartmentState(ApartmentState::MTA);
Console::WriteLine( "ThreadState: {0}, ApartmentState: {1}", newThread->ThreadState.ToString(), newThread->GetApartmentState().ToString() );
newThread->Start();
// Wait for newThread to start and go to sleep.
Thread::Sleep( 300 );
try
{
// This causes an exception since newThread is sleeping.
newThread->SetApartmentState(ApartmentState::STA);
}
catch ( ThreadStateException^ stateException )
{
Console::WriteLine( "\n{0} caught:\n"
"Thread is not in the Unstarted or Running state.", stateException->GetType()->Name );
Console::WriteLine( "ThreadState: {0}, ApartmentState: {1}", newThread->ThreadState.ToString(), newThread->GetApartmentState().ToString() );
}
}
using System;
using System.Threading;
class ApartmentTest
{
static void Main()
{
Thread newThread =
new Thread(new ThreadStart(ThreadMethod));
newThread.SetApartmentState(ApartmentState.MTA);
Console.WriteLine("ThreadState: {0}, ApartmentState: {1}",
newThread.ThreadState, newThread.GetApartmentState());
newThread.Start();
// Wait for newThread to start and go to sleep.
Thread.Sleep(300);
try
{
// This causes an exception since newThread is sleeping.
newThread.SetApartmentState(ApartmentState.STA);
}
catch(ThreadStateException stateException)
{
Console.WriteLine("\n{0} caught:\n" +
"Thread is not in the Unstarted or Running state.",
stateException.GetType().Name);
Console.WriteLine("ThreadState: {0}, ApartmentState: {1}",
newThread.ThreadState, newThread.GetApartmentState());
}
}
static void ThreadMethod()
{
Thread.Sleep(1000);
}
}
Imports System.Threading
Public Class ApartmentTest
<MTAThread> _
Shared Sub Main()
Dim newThread As Thread = New Thread(AddressOf ThreadMethod)
newThread.SetApartmentState(ApartmentState.MTA)
Console.WriteLine("ThreadState: {0}, ApartmentState: {1}", _
newThread.ThreadState, newThread.GetApartmentState())
newThread.Start()
' Wait for newThread to start and go to sleep.
Thread.Sleep(300)
Try
' This causes an exception since newThread is sleeping.
newThread.SetApartmentState(ApartmentState.STA)
Catch stateException As ThreadStateException
Console.WriteLine(vbCrLf & "{0} caught:" & vbCrLf & _
"Thread is not In the Unstarted or Running state.", _
stateException.GetType().Name)
Console.WriteLine("ThreadState: {0}, ApartmentState: " & _
"{1}", newThread.ThreadState, newThread.GetApartmentState())
End Try
End Sub
Shared Sub ThreadMethod()
Thread.Sleep(1000)
End Sub
End Class
注釈
アパートメントは、同じスレッド アクセス要件を共有するオブジェクトのプロセス内の論理コンテナーです。 同じアパートメント内のすべてのオブジェクトは、アパートメント内の任意のスレッドから呼び出しを受け取ることができます。 .NET Frameworkではアパートメントは使用されず、マネージド オブジェクトはスレッド セーフな方法ですべての共有リソースを使用する必要があります。
COM クラスはアパートメントを使用するため、共通言語ランタイムは、COM 相互運用状況で COM オブジェクトを呼び出すときにアパートメントを作成して初期化する必要があります。 マネージド スレッドは、1 つのスレッドのみを許可するシングル スレッド アパートメント (STA) または 1 つ以上のスレッドを含むマルチスレッド アパートメント (MTA) を作成して入力できます。 スレッドのプロパティを列挙の値の 1 つに設定 ApartmentState することで、作成されたアパートメントの種類を ApartmentState 制御できます。 特定のスレッドは COM アパートメントを 1 回だけ初期化できるため、アンマネージ コードの最初の呼び出し後にアパートメントの種類を変更することはできません。
詳細については、「Threadマネージド スレッドとアンマネージド スレッド」および「高度な COM 相互運用性」を参照してください。