Вопрос

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

Это было полезно?

Решение

Тот самый STAThreadAttribute по сути, это требование к Windows message pump для взаимодействия с COM-компонентами.Хотя ядро Windows Forms не использует COM, многие компоненты операционной системы, такие как системные диалоговые окна, используют эту технологию.

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

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

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

Другие советы

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

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

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

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

Читайте больше информации здесь (Архивировано в июне 2009 года)

и

Зачем требуется STAThread?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top