Что делает [STAThread]?

Я изучаю С# 3.5, и я хочу знать, что [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 г.)

и

Почему требуется STAThread?

Ответ 3

Сообщает компилятору, что вы находитесь в модели Single Thread Apartment. Это злая вещь COM, она обычно используется для оконных форм (gui's), так как использует Win32 для рисования, который реализуется как STA. Если вы используете что-то, что STA-модель из нескольких потоков, вы получаете поврежденные объекты.

Вот почему вы должны вызывать Gui из другого потока (если вы сделали кодировку любых форм).

В принципе, не беспокойтесь об этом, просто примите, что окна gui theads должны быть помечены как STA, иначе будет странно.