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

Вариация на предложение John's:

var flattenedValues = dict.Values.SelectMany(x => x);

при необходимости в них в списке можно, конечно, назвать ToList:

var flattenedList = dict.Values.SelectMany(x => x).ToList();
14
задан Daniel A. White 7 August 2014 в 12:56
поделиться

2 ответа

Это больше требование 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 ().

Я иногда сталкиваюсь с определенным кодом, который не запускается при вызове из потока, смоделированного STA, потому что он предназначен для отправки / получения данных через границы потока способами, которые не соответствуют ограничениям STA. Зная заранее, какая модель квартиры данного потока позволяет IDE перехватывать эти исключения во время компиляции, вместо того, чтобы получать неприятные ошибки нарушения прав доступа, когда вы пытаетесь использовать объект через границы потока во время выполнения.

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

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

Я иногда сталкиваюсь с определенным кодом, который не запускается при вызове из потока, смоделированного STA, потому что он предназначен для отправки / получения данных через границы потока способами, которые не соответствуют ограничениям STA. Зная заранее, какая модель квартиры данного потока позволяет IDE перехватывать эти исключения во время компиляции, вместо того, чтобы получать неприятные ошибки нарушения прав доступа, когда вы пытаетесь использовать объект через границы потока во время выполнения.

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

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

s предназначены для отправки / получения данных через границы потоков способами, которые не соответствуют ограничениям STA. Зная заранее, какая модель квартиры данного потока позволяет IDE перехватывать эти исключения во время компиляции, вместо того, чтобы получать неприятные ошибки нарушения прав доступа, когда вы пытаетесь использовать объект через границы потока во время выполнения.

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

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

s предназначены для отправки / получения данных через границы потоков способами, которые не соответствуют ограничениям STA. Зная заранее, какая модель квартиры данного потока позволяет IDE перехватывать эти исключения во время компиляции, вместо того, чтобы получать неприятные ошибки нарушения прав доступа, когда вы пытаетесь использовать объект через границы потока во время выполнения.

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

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

33
ответ дан 1 December 2019 в 07:19
поделиться

На этот вопрос есть отличный ответ в этой записи блога .

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

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

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

4
ответ дан 1 December 2019 в 07:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: