Bagikan melalui


ApartmentState Enum

Definisi

Menentukan status apartemen dari 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
Warisan
ApartmentState
Atribut

Bidang

Nama Nilai Deskripsi
STA 0

akan Thread membuat dan memasuki apartemen berulir tunggal.

MTA 1

akan Thread membuat dan memasuki apartemen multithreaded.

Unknown 2

Properti ApartmentState belum disetel.

Contoh

Contoh kode berikut menunjukkan cara mengatur status apartemen utas.

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

Keterangan

Apartemen adalah kontainer logis dalam proses untuk objek yang berbagi persyaratan akses utas yang sama. Semua objek di apartemen yang sama dapat menerima panggilan dari utas apa pun di apartemen. .NET Framework tidak menggunakan apartemen, dan objek terkelola bertanggung jawab untuk menggunakan semua sumber daya bersama dengan cara yang aman untuk utas itu sendiri.

Karena kelas COM menggunakan apartemen, runtime bahasa umum perlu membuat dan menginisialisasi apartemen saat memanggil objek COM dalam situasi interop COM. Utas terkelola dapat membuat dan memasukkan apartemen berulir tunggal (STA) yang hanya memungkinkan satu utas, atau apartemen multithreaded (MTA) yang berisi satu atau beberapa utas. Anda dapat mengontrol jenis apartemen yang dibuat dengan mengatur ApartmentState properti utas ke salah satu nilai ApartmentState enumerasi. Karena utas tertentu hanya dapat menginisialisasi apartemen COM sekali, Anda tidak dapat mengubah jenis apartemen setelah panggilan pertama ke kode yang tidak dikelola.

Untuk informasi selengkapnya, lihat Thread, Threading Terkelola dan Tidak Terkelola, dan Interoperabilitas COM Tingkat Lanjut.

Berlaku untuk

Lihat juga