SORU
11 Kasım 2010, PERŞEMBE


ApartmentState Aptallar için

Ben sadece bir hata, bu kullanma.:

_Thread.SetApartmentState(ApartmentState.STA);

Şimdi ne anlama geldiğini ve neden çalıştığını anlamak istiyorum!

CEVAP
11 Kasım 2010, PERŞEMBE


COM büyük babası .NET. Ben çok daha büyük hedefleri, COM ama yaptığı şeylerden biri de vardı .NET bir sınıf için bir iş parçacığı garanti sağlayan tamamen atlar. COM sınıfı vardır ne yayımlayabilirler. Ve COM altyapısı bu şartların olmasını sağlar.

Bu tamamen yoktur .NET. Bir Sıra kullanmak<>birden çok iş parçacığı, örneğin nesne ama eğer düzgün kilitli eğer, teşhis etmek çok zor kodunuzda iğrenç bir böcek.

COM iş parçacığı kesin ayrıntılarını bir yazıya sığmayacak kadar büyük. Sorunuza özellikleri üzerinde duracağım. COM nesneleri oluşturan bir iş parçacığı bir iş parçacığı seçenekleri sınırlı COM sınıfları vermek istediğini COM söylemeli. Bu sınıflar sadece destek sözde Apartman iş parçacığı, arabirim yöntemleri büyük çoğunluğu sadece güvenli bir örneğini oluşturan aynı iş çağrılabilir. Diğer bir deyişle, "ne olursa olsun bir iş parçacığı desteği yok, lütfen . umurlarında ilan ^em>aslayanlış konu beni çağırıyor". İstemci aslında kod bileyokbir başka konu arayın.

İki çeşit, STA (Tek Akıtılan grup) ve MTA var. Coınitializeex belirtilir() işlevi çağrısıgerekirCOM ile bir şey yok herhangi bir iş parçacığı tarafından çağrılabilir. CLR bir iş parçacığı başlatıldığında otomatik olarak arama yapar. Programın ana başlangıç iş parçacığı için, değeri [STAThread] pas veya [MTAThread] Ana özniteliği alır() yöntemi. Varsayılan MTA. SetApartmentState için bir çağrı tarafından belirlenir, ve kendi oluşturduğunuz konuları için). Varsayılan MTA. Havuzu iş parçacığı değiştirilemez her zaman MTA.

Bir STA gerektiren Windows içinde bir sürü kod var. Önemli örnek Pano, Sürükle ve kabuk diyaloglar (OpenFileDialog gibi). WPF ya da Windows Forms bir proje UI iş parçacığı her zaman bir pencere oluşturur herhangi bir iş parçacığı gibi STA olmalıdır.

Konu ancak STA COM için yaptığınız sözyoktek-iş parçacığı sözleşme takip gerektirir. Oldukça sert ve sözleşme kestiğinizde sorun teşhis etmek oldukça zor alabilirsiniz. Gereksinimleri vardıraslazaman herhangi bir miktar ve bir mesaj döngü pompa için iş parçacığı engeller. Bu son şart bir WPF veya Win' UI iş parçacığı ama eğer kendi STA iş parçacığı oluşturmak Kendin bakmak gerekir. tarafından karşılanır Sözleşme kırmak için ortak tanı çıkmaz.

Oldukça destek, biraz yerleşik bu gereksinimleri btw destek için CLR, seni beladan uzak tutmak için yardım var.kilitörneğin deyimi bir STA iş parçacığı üzerinde engellediğinde bir ileti döngüsü pompalayacak. En eşitleme sınıfları, kayda değer bir istisna olmak Dışlama gibi. Bu ancak tek ilgilenirasla blokgereklilik, hala kendi ileti döngüsü oluşturmanız gerekir. Uygulama.() Çalıştırmak hem WPF ve Win.

Daha önce bir ileti COM mutlu etmek için döngüye sahip olmanın önemi hakkında daha fazla bilgi içeren bir cevap katkıda ettim. post here bulabilirsiniz.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bryan Smith

    Bryan Smith

    12 Mart 2006
  • BSA

    BSA

    9 NİSAN 2012
  • Helder Barreto

    Helder Barre

    22 Mayıs 2006