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

293

Я изучаю C # 3.5, и я хочу знать, что [STAThread]делает в наших программах?

odiseh
источник

Ответы:

240

По STAThreadAttributeсути, это требование к насосу сообщений Windows для связи с компонентами COM. Хотя ядро ​​Windows Forms не использует COM, многие компоненты ОС, такие как системные диалоги, используют эту технологию.

MSDN объясняет причину чуть более подробно:

Атрибут STAThreadAttribute указывает, что модель потока COM для приложения является однопоточным. Этот атрибут должен присутствовать в точке входа любого приложения, использующего Windows Forms; если он опущен, компоненты Windows могут работать неправильно. Если атрибут отсутствует, приложение использует модель многопоточной квартиры, которая не поддерживается для Windows Forms.

Этот пост в блоге ( почему требуется STAThread? ) Также достаточно хорошо объясняет это требование. Если вы хотите получить более подробное представление о том, как работает модель потоков на уровне CLR, см. Эту статью журнала MSDN за июнь 2004 года (архив, апрель 2009 года).

нолдорин
источник
1
Любая идея, почему CompactFramework не поддерживает [STAThread]?
bvdb
1
stackoverflow.com/questions/4154429/apartmentstate-for-dummies этот ответ довольно понятен для таких смертных, как я. Добавлено только для справки здесь
Barış Akkurt
41

Он сообщает компилятору, что вы находитесь в модели однопотоковой квартиры. Это злая вещь COM, обычно она используется для Windows Forms (GUI), так как она использует Win32 для рисования, которое реализовано как STA. Если вы используете что-то, что является моделью STA из нескольких потоков, то вы получите поврежденные объекты.

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

По сути, не беспокойтесь об этом, просто примите, что потоки графического интерфейса Windows должны быть помечены как STA, в противном случае происходят странные вещи.

кладовая для продуктов
источник
2
STAThread не имеет ничего общего с требованием вызывать основной поток при доступе к GUI. Это происходит просто из-за природы обработчика сообщений Windows, и его нельзя избежать более широко в многопоточных приложениях.
Нолдорин
3
На самом деле речь идет только о работе с COM-компонентами, такими как диалоги ОС и сторонние компоненты.
Нолдорин
3
Win32 не имеет концепции многопоточности квартир, его COM, который представляет эту концепцию. COM «перезаписывает» систему, которая была полностью независимой от потоков (насос сообщений Windows) в качестве средства синхронизации / сериализации выполнения кода в COM-квартирах.
AnthonyWJones
1
Просто примите, что Windows GUI Theads должны быть помечены как STA, иначе происходят странные вещи. :))))))
Нипуна
1
@Noldorin «требование вызывать основной поток» - это технически не требование . Межпотоковые исключения не возникают вне отладчика. Ссылка: stackoverflow.com/questions/3972727/… . Не говоря, что вы не должны решать эту проблему, однако!
Шив
31

Атрибут STAThreadAttribute отмечает поток для использования однопоточной COM-квартиры, если требуется COM. По умолчанию .NET вообще не инициализирует COM. Только тогда, когда необходим COM, например, когда создается объект COM или элемент управления COM или когда необходимо перетаскивание 'n', COM инициализируется. Когда это происходит, .NET вызывает базовую функцию CoInitializeEx, которая принимает флаг, указывающий, присоединять ли поток к многопоточному или однопоточному помещению.

Подробнее читайте здесь (Архив, июнь 2009)

и

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

Рахул
источник