invalidApartmentStateChange MDA

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 şekilde değişir.

Belirtiler

  • bir iş parçacığının COM daire durumu istenen durum değil. Bu, proxy'lerin geçerlisinden 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ı (RCW) üzerinde çağrı yaparken a'ya 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.

Nedeni

  • İş parçacığı daha önce farklı bir COM daire durumuna başlatıldı. Bir iş parçacığının daire 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öntem (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 kadar çağrıyı geciktirecek şekilde değiştirilmelidir ve iş parçacığı tarafından kullanılmakta olan RCW'ler ve temel com bileşenleri yoktur. 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ğinde bu MDA'nın etkinleştirebileceği bir durum gösterilmektedir.

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

Ayrıca bkz.