invalidApartmentStateChange MDA

Uyarı

Bu makale .NET Framework'e özgüdür. .NET 6 ve sonraki sürümleri de dahil olmak üzere daha yeni .NET uygulamaları için geçerli değildir.

Yönetilen invalidApartmentStateChange hata ayıklama yardımcısı (MDS) iki sorundan biri tarafından etkinleştirilir:

  • COM tarafından zaten başlatılmış olan bir iş parçacığının COM daire durumunu farklı bir daire durumuna değiştirmeye çalışılır.

  • bir iş parçacığının COM daire durumu beklenmedik bir şekilde değişir.

Symptoms

  • bir iş parçacığının COM daire durumu istenen durum değil. Bu, proxy'lerin geçerli olandan farklı bir iş parçacığı modeline sahip COM bileşenleri için kullanılmasına neden olabilir. Bu da, daireler arası sıralama için ayarlanmayan arabirimler aracılığıyla COM nesnesi çağrılırken bir InvalidCastException atılması neden olabilir.

  • İş parçacığının COM daire durumu beklenenden farklı. Bu, hem RPC_E_WRONG_THREAD HRESULT ile hem de COMExceptionInvalidCastException (RCW) çağrı yaparken a'ya neden olabilir. Bu, bazı tek iş parçacıklı COM bileşenlerine aynı anda birden çok iş parçacığı tarafından erişilmesine de neden olabilir ve bu da bozulmaya veya veri kaybına neden olabilir.

Nedeni

  • İş parçacığı daha önce farklı bir COM apartman durumuna başlatıldı. Bir iş parçacığının apartman durumunun açıkça veya örtük olarak ayarlanabileceğini unutmayın. Açık işlemler özelliğini ve Thread.ApartmentState ve SetApartmentState yöntemlerini içerirTrySetApartmentState. yöntemi kullanılarak Start oluşturulan bir iş parçacığı, iş parçacığı başlatılmadan önce çağrılmadığı sürece MTA örtük olarak olarak ayarlanırSetApartmentState. Özniteliği ana yöntemde belirtilmediği sürece MTA uygulamanın ana iş parçacığı da örtük olarak olarak başlatılırSTAThreadAttribute.

  • İş CoUninitialize parçacığında CoInitializeEx farklı bir eşzamanlılık modeline sahip yöntemi (veya yöntemi) çağrılır.

Çözünürlük

Yürütmeye başlamadan önce iş parçacığının apartman durumunu ayarlayın veya özniteliğini veya STAThreadAttribute özniteliğini uygulamanın ana yöntemine uygulayınMTAThreadAttribute.

İkinci neden için ideal olarak, yöntemini çağıran CoUninitialize kod, iş parçacığı sonlandırılacak duruma gelene ve iş parçacığı tarafından hala kullanımda olan RCW'ler ve temel COM bileşenleri kalmayıncaya kadar çağrıyı geciktirecek şekilde değiştirilmelidir. Ancak, yöntemini çağıran CoUninitialize kodu değiştirmek mümkün değilse, bu şekilde başlatılmamış iş parçacıklarından hiçbir RCW kullanılmamalıdır.

Çalışma Zamanı üzerindeki etkisi

Bu MDA'nın CLR üzerinde hiçbir etkisi yoktur.

Çıkış

Geçerli iş parçacığının COM daire durumu ve kodun uygulamaya çalıştığı durum.

Konfigürasyon

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

Example

Aşağıdaki kod örneği, bu MDA'yi etkinleştirebilecek bir durumu gösterir.

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

Ayrıca bakınız