Ответы:
По 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 из другого потока (если вы сделали какие-либо формы кодирования).
По сути, не беспокойтесь об этом, просто примите, что потоки графического интерфейса Windows должны быть помечены как STA, в противном случае происходят странные вещи.
Атрибут STAThreadAttribute отмечает поток для использования однопоточной COM-квартиры, если требуется COM. По умолчанию .NET вообще не инициализирует COM. Только тогда, когда необходим COM, например, когда создается объект COM или элемент управления COM или когда необходимо перетаскивание 'n', COM инициализируется. Когда это происходит, .NET вызывает базовую функцию CoInitializeEx, которая принимает флаг, указывающий, присоединять ли поток к многопоточному или однопоточному помещению.
Подробнее читайте здесь (Архив, июнь 2009)
и
[STAThread]
?