2009-09-01 15 views

Odpowiedz

199

Urządzenie STAThreadAttribute jest zasadniczo wymogiem, aby pompa komunikatów systemu Windows komunikowała się ze składnikami COM. Chociaż podstawowy Windows Forms nie używa COM, wiele komponentów systemu operacyjnego, takich jak okna dialogowe systemu, korzysta z tej technologii.

MSDN wyjaśnia przyczyny w nieco bardziej szczegółowo:

STAThreadAttribute wskazuje, że gwintowanie modelu COM do stosowania jest jednowątkowy mieszkania. Ten atrybut musi być obecny w punkcie wejścia dowolnej aplikacji , która używa Windows Forms; jeśli zostanie pominięty, składniki systemu Windows mogą nie działać poprawnie. Jeśli atrybut nie jest obecny, aplikacja korzysta z modelu wielowątkowego , który nie jest obsługiwany w systemie Windows Forms pod numerem .

This blog post (Dlaczego STAThread wymagane?) wyjaśnia również wymóg całkiem dobrze. Jeśli chcesz uzyskać bardziej szczegółowy obraz działania modelu wątków na poziomie CLR, zobacz this MSDN Magazine article from June 2004 (Archived, kwiec. 2009).

+1

jakiś pomysł dlaczego CompactFramework nie obsługuje '[STAThread]'? – bvdb

20

Informuje kompilator, że znajdujesz się w modelu z pojedynczym wątkiem. Jest to zła rzecz COM, zwykle jest używana w Windows Forms (GUI), ponieważ używa Win32 do swojego rysunku, który jest zaimplementowany jako STA. Jeśli używasz czegoś, co jest modelem STA z wielu wątków, otrzymujesz uszkodzone obiekty.

Dlatego musisz przywołać Gui z innego wątku (jeśli zrobiłeś jakieś kodowanie formularzy).

Zasadniczo nie przejmuj się tym, po prostu zaakceptuj, że wątki Windows GUI muszą być oznaczone jako STA, w przeciwnym razie wydarzy się coś dziwnego.

+1

STAThread nie ma nic wspólnego z wymaganiem wywołania głównego wątku podczas uzyskiwania dostępu do GUI.Jest to po prostu spowodowane rodzajem pompy komunikatów systemu Windows i nie można jej bardziej uniknąć w aplikacjach wielowątkowych. – Noldorin

+3

W rzeczywistości dotyczy to tylko elementów COM, takich jak okna dialogowe systemu operacyjnego i komponenty firm trzecich. – Noldorin

+3

System Win32 nie zawiera koncepcji nawlekania mieszkań, a jej COM wprowadza koncepcję. COM "ponawia zadania", co było całkowicie wątkowym systemem agnostycznym (pompa komunikatów Windows) jako sposób synchronizacji/serializacji wykonywania kodu w apartamentach COM. – AnthonyWJones

27

STAThreadAttribute wyznacza wątek używać jednowątkowy COM COM apartament jeśli jest potrzebna. Domyślnie, NET nie zainicjuje modelu COM pod numerem . Tylko wtedy, gdy potrzebny jest COM, , podobnie jak wtedy, gdy tworzony jest obiekt COM lub kontrola COM lub gdy wymagane jest przeciągnięcie 'n' jest , to COM jest zainicjowany. Kiedy to nastąpi, NET wywołuje leżącą u podstaw funkcji CoInitializeEx, , która przyjmuje flagę wskazującą, czy ma dołączyć do wątku do wielowątkowego lub jednowątkowego mieszkania.

Czytaj więcej info here (archiwizowane, czerwiec 2009)

i

Why is STAThread required?