Відповіді:
По STAThreadAttribute
суті, це вимога, щоб насос повідомлень Windows спілкувався з компонентами COM. Хоча основні Windows Forms не використовують COM, у багатьох компонентах ОС, таких як діалоги системи, використовується ця технологія.
MSDN пояснює причину дещо детальніше:
STAThreadAttribute вказує, що модель різьблення COM для програми є однопоточною квартирою. Цей атрибут повинен бути присутнім у точці входу будь-якої програми, яка використовує Windows Forms; якщо він пропущений, компоненти Windows можуть працювати неправильно. Якщо атрибута немає, програма використовує багатопоточну модель квартири, яка не підтримується для Windows Forms.
Ця публікація в блозі ( чому потрібен STAThread? ) Також досить добре пояснює цю вимогу. Якщо ви хочете більш детально переглянути, як працює модель різьблення на рівні CLR, перегляньте цю статтю журналу MSDN від червня 2004 року (Архівовано, квітня 2009 р.).
Він повідомляє компілятору, що ви є моделлю квартири з однією ниткою. Це злі COM речі, зазвичай вони використовуються для Windows Forms (GUI), оскільки для його малювання використовується Win32, який реалізований як STA. Якщо ви використовуєте щось, що є моделлю STA з декількох потоків, ви отримуєте пошкоджені об'єкти.
Ось чому вам доведеться посилатися на Gui з іншого потоку (якщо ви робили будь-які форми кодування).
В основному не хвилюйтеся з цього приводу, просто прийміть, що теми GUI Windows повинні бути позначені як STA, інакше трапляються дивні речі.
STAThreadAttribute позначає нитку для використання однопотокової COM-квартири, якщо потрібна COM. За замовчуванням .NET взагалі не ініціалізує COM. Тільки тоді, коли COM потрібен, наприклад, коли створюється об'єкт COM або COM Control або потрібне перетягування "n", це COM ініціалізується. Коли це станеться.
Детальніше читайте тут (в архіві, червень 2009 р.)
і
[STAThread]
?