Я изучаю С# 3.5, и я хочу знать, что [STAThread]
делает в наших программах?
Что делает [STAThread]?
Ответ 1
STAThreadAttribute
по существу является обязательным требованием для обмена сообщениями с сервером сообщений Windows с компонентами COM. Хотя основные Windows Forms не используют COM, многие компоненты ОС, такие как системные диалоги, используют эту технологию.
MSDN объясняет причину чуть более подробно:
STAThreadAttribute указывает, что COM-резьбовая модель для приложение однопоточное квартира. Этот атрибут должен быть присутствовать в точке входа любого приложение, использующее Windows Forms; если он опускается, Windows компоненты могут работать неправильно. Если атрибут отсутствует, приложение использует многопоточность модель квартиры, которая не является поддерживается для Windows Forms.
Это сообщение в блоге (Почему требуется STAThread?) также очень хорошо объясняет это требование. Если вы хотите более подробное представление о том, как модель потоковой обработки работает на уровне CLR, см. эту статью в MSDN Magazine с июня 2004 г. (в архиве, Апрель 2009 г.).
Ответ 2
STAThreadAttribute отмечает поток для использования однопотокового COM Квартира, если требуется COM. От default,.NET не будет инициализировать COM в все. Это только когда требуется COM, например, когда COM-объект или COM-управление создается или когда drag 'n' падает необходимо, чтобы COM инициализировался. когда это происходит,.NET вызывает основная функция CoInitializeEx, который принимает флаг, указывающий, присоединиться к потоку к многопоточному или однопоточной квартире.
Подробнее здесь (в архиве, июнь 2009 г.)
и
Ответ 3
Сообщает компилятору, что вы находитесь в модели Single Thread Apartment. Это злая вещь COM, она обычно используется для оконных форм (gui's), так как использует Win32 для рисования, который реализуется как STA. Если вы используете что-то, что STA-модель из нескольких потоков, вы получаете поврежденные объекты.
Вот почему вы должны вызывать Gui из другого потока (если вы сделали кодировку любых форм).
В принципе, не беспокойтесь об этом, просто примите, что окна gui theads должны быть помечены как STA, иначе будет странно.