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ığındaCoInitializeEx
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);
}
}
}