Odpowiedzi:
Jest STAThreadAttribute
to zasadniczo wymóg, aby pompa komunikatów systemu Windows komunikowała się ze składnikami COM. Chociaż podstawowe formularze Windows Forms nie używają COM, wiele składników systemu operacyjnego, takich jak okna dialogowe systemu, korzysta z tej technologii.
MSDN wyjaśnia przyczynę nieco bardziej szczegółowo:
STAThreadAttribute wskazuje, że model wątków COM dla aplikacji jest jednowątkowy. Ten atrybut musi być obecny w punkcie wejścia każdej aplikacji korzystającej z formularzy Windows; jeśli zostanie pominięty, składniki systemu Windows mogą nie działać poprawnie. Jeśli ten atrybut nie jest obecny, aplikacja korzysta z wielowątkowego modelu mieszkania, który nie jest obsługiwany w formularzach Windows Forms.
Ten post na blogu ( Dlaczego wymagany jest STAThread? ) Również dość dobrze wyjaśnia ten wymóg. Jeśli chcesz uzyskać bardziej szczegółowe informacje o tym, jak działa model gwintowania na poziomie CLR, zapoznaj się z tym artykułem MSDN Magazine z czerwca 2004 r. (Archiwum, kwiecień 2009).
Mówi kompilatorowi, że jesteś w modelu apartamentu z jednym wątkiem. Jest to zła rzecz COM, jest zwykle używana w Windows Forms (GUI), ponieważ używa ona Win32 do rysowania, 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 wywoływać Gui z innego wątku (jeśli wykonałeś kodowanie formularzy).
Zasadniczo nie przejmuj się tym, po prostu zaakceptuj, że wątki GUI systemu Windows muszą być oznaczone jako STA, w przeciwnym razie zdarzają się dziwne rzeczy.
STAThreadAttribute oznacza wątek, który będzie używał jedno-wątkowego apartamentu COM, jeśli COM jest potrzebny. Domyślnie .NET w ogóle nie inicjuje COM. Tylko wtedy, gdy potrzebny jest COM, np. Gdy tworzony jest obiekt COM lub kontrolka COM lub gdy potrzebne jest przeciąganie i upuszczanie, COM jest inicjowany. Kiedy tak się dzieje, .NET wywołuje podstawową funkcję CoInitializeEx, która pobiera flagę wskazującą, czy dołączyć wątek do mieszkania wielowątkowego czy jednowątkowego.
Przeczytaj więcej informacji tutaj (zarchiwizowane, czerwiec 2009)
i
[STAThread]
?