Почему WPF требует, чтобы атрибут STAThread применялся к методу Main?

Я новичок в WPF, и в каждом учебнике, которое я прочитал, у них либо есть атрибут [System.STAThread], примененный к их методу Main, либо они говорят читателю об этом.

Действительно ли этот атрибут "требуется"? И если да, то почему?

Ответы

Ответ 1

Это скорее требование Windows, чем WPF, и возвращается к исходному дизайну форм и элементов Windows, начиная с .NET.

STAThread относится к "однопоточным квартирам", который относится к модели потоков, используемой текущей (основной) нитью. Используемая модель потоковой передачи определяет, как другие .NET и COM-приложения будут разговаривать с вашим приложением (и, по сути, своими потоками). Однопоточная модель приложения требует, чтобы ни один объект не "жил" в более чем одном потоке STA одновременно, стирается модель потока MTA; и позволяет передавать указатели на данные по квартирам только через маршаллинг-объект.

В основном, с объявлением [STAThread], другие приложения будут знать, что такое политика потоков при отправке данных. Модель STA является наиболее распространенной моделью потоков для потоков/приложений Windows; но иногда вы сталкиваетесь с определенным кодом, который не будет запускаться, если вызван из потока с использованием STA-модели, поскольку он предназначен для отправки/получения данных через границы потоков способами, которые не соответствуют ограничениям STA. Зная заранее, что модель квартиры данного потока позволяет IDE улавливать эти исключения во время компиляции, а не получать неприятные ошибки при нарушении прав при попытке использовать объект через границы потоков во время выполнения.

Вы можете прочитать о потоках STA и MTA из статьи MSDN по адресу: http://msdn.microsoft.com/en-us/library/ms680112(VS.85).aspx

Обратите внимание, что даже обычные приложения .NET(от WPF) требовали декларации [STAThread] на вершине main().

Ответ 2

В этом замечательном ответе на этот запись в блоге.

Цитата из блога:

Когда STAThreadAttribute является применяется, он меняет квартиру состояние текущей нити однопоточный. Не вдаваясь огромная дискуссия о COM и Threading, этот атрибут обеспечивает механизм связи между текущая нить и другие потоки, которые может захотеть поговорить с ним через COM. когда вы используете Windows Forms, в зависимости от на той функции, которую вы используете, это может быть используя COM-взаимодействие для того, чтобы общаться с операционной системой компоненты. Хорошими примерами этого являются Буфер обмена и Диалоги файлов.

Windows Forms не поддерживается внутри MTA или бесплатная квартира с резьбой. Приложения, использующие Windows Forms всегда должен объявлять квартиру стиль, который они используют, как некоторые другие компонент может инициализировать плохое состояние в квартире.