invalidApartmentStateChange MDA

Nota

Artikel ini khusus untuk .NET Framework. Ini tidak berlaku untuk implementasi .NET yang lebih baru, termasuk .NET 6 dan versi yang lebih baru.

Asisten penelusuran kesalahan terkelola invalidApartmentStateChange (MDS) diaktifkan oleh salah satu dari dua masalah:

  • Upaya dilakukan untuk mengubah status apartemen COM dari utas yang telah diinisialisasi oleh COM ke status apartemen yang berbeda.

  • Status apartemen COM dari utas berubah secara tak terduga.

Gejala

  • Status apartemen COM utas bukan yang diminta. Ini dapat menyebabkan proksi digunakan untuk komponen COM yang memiliki model utas yang berbeda dari yang saat ini. Hal ini pada gilirannya dapat menyebabkan dilemparkan InvalidCastException ketika memanggil objek COM melalui antarmuka yang tidak diatur untuk marshalling lintas apartemen.

  • Status apartemen COM dari utas berbeda dari yang diharapkan. Ini dapat menyebabkan COMException dengan HRESULT RPC_E_WRONG_THREAD serta InvalidCastException saat melakukan panggilan pada Runtime Callable Wrapper (RCW). Hal ini juga dapat menyebabkan beberapa komponen COM berulir tunggal diakses oleh beberapa utas secara bersamaan, yang dapat menyebabkan kerusakan atau kehilangan data.

Penyebab

  • Utas sebelumnya diinisialisasi ke status apartemen COM yang berbeda. Perhatikan bahwa status apartemen utas dapat diatur secara eksplisit atau implisit. Operasi eksplisit mencakup Thread.ApartmentState properti dan SetApartmentState metode dan TrySetApartmentState . Utas yang dibuat menggunakan Start metode secara implisit diatur ke MTA kecuali SetApartmentState dipanggil sebelum utas dimulai. Utas utama aplikasi juga secara implisit diinisialisasi kecuali MTASTAThreadAttribute atribut ditentukan pada metode utama.

  • Metode CoUninitialize (atau CoInitializeEx metode) dengan model konkurensi yang berbeda dipanggil pada utas.

Resolution

Atur status apartemen utas sebelum mulai dieksekusi, atau terapkan STAThreadAttribute atribut atau MTAThreadAttribute atribut ke metode utama aplikasi.

Untuk penyebab kedua, idealnya, kode yang memanggil CoUninitialize metode harus dimodifikasi untuk menunda panggilan sampai utas akan dihentikan dan tidak ada RCW dan komponen COM yang mendasarnya masih digunakan oleh utas. Namun, jika tidak mungkin untuk memodifikasi kode yang memanggil CoUninitialize metode , maka tidak ada RCW yang harus digunakan dari utas yang tidak diinisialisasi dengan cara ini.

Efek pada Runtime

MDA ini tidak berpengaruh pada CLR.

Hasil

Status apartemen COM dari utas saat ini, dan status bahwa kode sedang mencoba untuk menerapkan.

Konfigurasi

<mdaConfig>
  <assistants>
    <invalidApartmentStateChange />
  </assistants>
</mdaConfig>

Example

Contoh kode berikut menunjukkan situasi yang dapat mengaktifkan MDA ini.

using System.Threading;
namespace ApartmentStateMDA
{
    class Program
    {
        static void Main(string[] args)
        {
            Thread.CurrentThread.SetApartmentState(ApartmentState.STA);
        }
    }
}

Baca juga