Aracılığıyla paylaş


invalidApartmentStateChange MDA

Not

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.

Belirtiler

  • 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 InvalidCastException Çalışma Zamanı Çağrılabilen Sarmalayıcıda(RCW) çağrı yaparken bir'e neden COMException 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.

Neden

  • İş 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 SetApartmentState ve TrySetApartmentState yöntemlerini içerirThread.ApartmentState. yöntemi kullanılarak Start oluşturulan bir iş parçacığı, iş parçacığı başlatılmadan önce çağrılmadığı sürece SetApartmentState örtük olarak olarak ayarlanırMTA. Özniteliği ana yöntemde belirtilmediği sürece STAThreadAttribute uygulamanın ana iş parçacığı da örtük olarak olarak başlatılırMTA.

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

Çözüm

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

İ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.

Çıktı

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

Yapılandırma

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

Örnek

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 bkz.