[STAThread] ne yapıyor?


293

C # 3.5 öğreniyorum ve [STAThread]programlarımızda ne olduğunu bilmek istiyorum ?

Yanıtlar:


240

Bu STAThreadAttribute, Windows ileti pompasının COM bileşenleri ile iletişim kurması için bir gereksinimdir. Çekirdek Windows Forms COM kullanmasa da, sistem iletişim kutuları gibi işletim sisteminin birçok bileşeni bu teknolojiyi kullanır.

MSDN nedeni biraz daha ayrıntılı olarak açıklıyor:

STAThreadAttribute, uygulamanın COM iş parçacığı modelinin tek iş parçacıklı daire olduğunu belirtir. Bu öznitelik, Windows Forms kullanan herhangi bir uygulamanın giriş noktasında bulunmalıdır; atlanırsa, Windows bileşenleri düzgün çalışmayabilir. Öznitelik yoksa, uygulama Windows Forms için desteklenmeyen çok iş parçacıklı daire modelini kullanır.

Bu blog yazısı ( STAThread neden gereklidir? ) Gereksinimi de oldukça iyi açıklıyor. İş parçacığı modelinin CLR düzeyinde nasıl çalıştığına ilişkin daha ayrıntılı bir görünüm istiyorsanız , Haziran 2004'teki bu MSDN Magazine makalesine bakın (Arşiv, Nisan 2009).


1
CompactFramework neden desteklemiyor [STAThread]?
bvdb

1
stackoverflow.com/questions/4154429/apartmentstate-for-dummies Bu cevap benim gibi ölümlüler için oldukça anlaşılır. Sadece referans olarak eklendi
Barış Akkurt

41

Derleyiciye bir Tek İplikli Daire modelinde olduğunuzu söyler. Bu kötü bir COM şeydir, genellikle Windows Forms (GUI) için kullanılır ve çizim için Win32 olarak STA olarak uygulanır. Birden çok iş parçacığından STA modeli olan bir şey kullanıyorsanız, bozuk nesneler elde edersiniz.

Bu nedenle başka bir iş parçacığından Gui'ye çağırmanız gerekir (herhangi bir form kodlaması yaptıysanız).

Temelde endişelenmeyin, sadece Windows GUI iş parçacıklarının STA olarak işaretlenmesi gerektiğini kabul edin, aksi takdirde garip şeyler olur.


2
STAThread, GUI'ye erişirken ana iş parçacığını çağırma gereksinimi ile ilgisi yoktur. Bu sadece Windows mesaj pompasının doğasından kaynaklanmaktadır ve çok iş parçacıklı uygulamalarda daha genel olarak önlenemez.
Noldorin

3
Gerçekten, sadece OS diyalogları ve üçüncü taraf bileşenleri gibi COM bileşenleri ile uğraşmakla ilgilidir.
Noldorin

3
Win32, daireleri tanıtan COM, daire iş parçacığı kavramı taşır. COM daireler COM kod senkronizasyonu / seri hale getirmek için bir araç olarak tamamen iplik agnostik sistemi (windows mesaj pompası) ne "yeniden görevleri".
AnthonyWJones

1
Sadece Windows gui başlıkları STA olarak işaretlenmelidir, aksi takdirde garip şeyler olur. :))))))
Nipuna

1
@Noldorin "ana iş parçacığı çağırmak için gereksinimi" - bu teknik olarak bir zorunluluk değildir . Hata ayıklayıcı dışında çapraz iş parçacığı özel durumları oluşmaz. Ref: stackoverflow.com/questions/3972727/… . Ancak bu sorunu çözmemeniz gerektiğini söylemiyorum!
Shiv

31

STAThreadAttribute, COM gerekiyorsa Tek iş parçacıklı COM daire kullanmak için bir iş parçacığı işaretler. Varsayılan olarak, .NET COM'u hiç başlatmaz. Yalnızca COM gerektiğinde, örneğin bir COM nesnesi veya COM Denetimi oluşturulduğunda veya sürükleme 'n' bırakması gerektiğinde, COM başlatılır. Bu durumda, .NET, iş parçacığının çok iş parçacıklı veya tek iş parçacıklı bir daireye birleştirilip birleştirilmeyeceğini belirten bir bayrak alan temel CoInitializeEx işlevini çağırır.

Daha fazla bilgiyi burada okuyun (Arşivlendi, Haziran 2009)

ve

STAThread neden gereklidir?

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.