ApartmentState Výčet
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Určuje stav Threadbytu .
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
- Dědičnost
- Atributy
Pole
MTA | 1 | Vytvoří Thread a vstoupí do vícevláknového bytu. |
STA | 0 | Vytvoří Thread se a vstoupí do apartmánu s jedním vláknem. |
Unknown | 2 | Vlastnost ApartmentState nebyla nastavena. |
Příklady
Následující příklad kódu ukazuje, jak nastavit stav bytu vlákna.
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
Poznámky
Apartmán je logický kontejner v rámci procesu pro objekty sdílející stejné požadavky na přístup k vláknům. Všechny objekty ve stejném bytě mohou přijímat volání z libovolného vlákna v bytě. .NET Framework nepoužívá apartmány a spravované objekty jsou zodpovědné za použití všech sdílených prostředků bezpečným způsobem.
Vzhledem k tomu, že třídy modelu COM používají apartmány, musí modul CLR (Common Language Runtime) vytvořit a inicializovat byt při volání objektu COM v situaci vzájemné spolupráce modelu COM. Spravované vlákno může vytvořit a zadat jednovláknový byt (STA), který umožňuje pouze jedno vlákno, nebo vícevláknový apartmán (MTA), který obsahuje jedno nebo více vláken. Typ bytu vytvořený nastavením ApartmentState vlastnosti vlákna můžete řídit na jednu z hodnot výčtu ApartmentState . Vzhledem k tomu, že dané vlákno může inicializovat pouze jeden apartmán modelu COM, nelze změnit typ apartmánu po prvním volání nespravovaného kódu.
Další informace najdete v tématech Thread, spravované a nespravované podprocesy a pokročilou interoperabilitu modelu COM.