ApartmentState 列挙体
アセンブリ: mscorlib (mscorlib.dll 内)
構文
<SerializableAttribute> _ <ComVisibleAttribute(True)> _ Public Enumeration ApartmentState
メンバ名 | 説明 | |
---|---|---|
MTA | Thread は、マルチスレッド アパートメントを作成および入力します。 | |
STA | Thread は、シングルスレッド アパートメントを作成および入力します。 | |
Unknown | ApartmentState プロパティが設定されていません。 |
アパートメントとは、同じスレッド アクセス要件を共有するオブジェクトのプロセス内の論理コンテナです。同じアパートメント内のオブジェクトはすべて、そのアパートメント内のどのスレッドからの呼び出しも受け取ることができます。.NET Framework はアパートメントを使用せず、マネージ オブジェクトはスレッド セーフな方法ですべての共有リソースを独自に使用します。
COM クラスはアパートメントを使用するため、共通言語ランタイムでは、COM 相互運用状況で COM オブジェクトを呼び出すときにアパートメントを作成および初期化する必要があります。マネージ スレッドでは、1 つのスレッドだけを格納できるシングルスレッド アパートメント (STA: single-threaded apartment)、または 1 つ以上のスレッドを格納するマルチスレッド アパートメント (MTA: multithreaded apartment) を作成および入力できます。作成するアパートメントの種類を制御するには、スレッドの ApartmentState プロパティを ApartmentState 列挙体の値の 1 つに設定します。1 つのスレッドでは COM アパートメントを一度しか初期化できないため、アンマネージ コードを一度呼び出すと、アパートメントの種類は変更できません。
詳細については、「Thread」、「マネージ スレッドとアンマネージ スレッド」、および「高度な COM 相互運用性」を参照してください。
スレッドのアパートメントの状態を設定する方法の例を次に示します。
Imports Microsoft.VisualBasic Imports System Imports System.Threading Public Class ApartmentTest <MTAThread> _ Shared Sub Main() Dim newThread As Thread = New Thread(AddressOf ThreadMethod) newThread.SetApartmentState(ApartmentState.MTA) ' The following line is ignored since ' ApartmentState can only be set once. newThread.SetApartmentState(ApartmentState.STA) 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
using System; using System.Threading; class ApartmentTest { static void Main() { Thread newThread = new Thread(new ThreadStart(ThreadMethod)); newThread.SetApartmentState(ApartmentState.MTA); // The following line is ignored since // ApartmentState can only be set once. newThread.SetApartmentState(ApartmentState.STA); Console.WriteLine("ThreadState: {0}, ApartmentState: {1}", newThread.ThreadState, newThread.ApartmentState); 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); } }
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); // The following line is ignored since // ApartmentState can only be set once. newThread->SetApartmentState(ApartmentState::STA); 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() ); } }
import System.*; import System.Threading.*; import System.Threading.Thread; class ApartmentTest { public static void main(String[] args) { Thread newThread = new Thread(new ThreadStart(ThreadMethod)); newThread.set_ApartmentState(ApartmentState.MTA); // The following line is ignored since // ApartmentState can only be set once. newThread.set_ApartmentState(ApartmentState.STA); Console.WriteLine("ThreadState: {0}, ApartmentState: {1}", newThread.get_ThreadState(), newThread.get_ApartmentState()); newThread.Start(); // Wait for newThread to start and go to sleep. Thread.Sleep(300); try { // This causes an exception since newThread is sleeping. newThread.set_ApartmentState(ApartmentState.STA); } catch (ThreadStateException stateException) { Console.WriteLine("\n{0} caught:\n" + "Thread is not in the Unstarted or Running state.", stateException.GetType().get_Name()); Console.WriteLine("ThreadState: {0}, ApartmentState: {1}", newThread.get_ThreadState(),newThread.get_ApartmentState()); } } //main static void ThreadMethod() { Thread.Sleep(1000); } //ThreadMethod } //ApartmentTest
Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile for Pocket PC, Windows Mobile for Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。
参照
- ApartmentState 列挙体のページへのリンク