STAThread и multithreading

Из статьи MSDN на STAThread:

Указывает, что модель поточной передачи COM для приложения представляет собой однопоточную квартиру (STA).

(Для справки, вот и вся статья .)

Одноволоконная квартира … ОК, это перевернуло мне голову. Кроме того, я где-то читал, что, если ваше приложение не использует COM-взаимодействие, этот атрибут фактически ничего не делает. Итак, что именно он делает и как это влияет на многопоточные приложения? Должны ли многопоточные приложения (которые include в себя что-либо от любого пользователя, использующего Timer s, к асинхронным вызовам метода, а не только для streamов и т. Д.), Используйте MTAThread, даже если это «просто безопасно»? Что действительно делают STAThread и MTAThread?

Нарезка квартиры – концепция COM; если вы не используете COM, и ни один из API, которые вы вызываете, не использует COM «под обложками», тогда вам не нужно беспокоиться о квартирах.

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

То, что это делает, гарантирует, что CoInitialize называется параметром COINIT_APARTMENTTHREADED. Если вы не используете никаких COM-компонентов или элементов ActiveX, это никак не повлияет на вас. Если вы это сделаете, это будет иметь решающее значение.

Элементы управления, которые являются потолочными, фактически однопоточные, вызовы, сделанные для них, могут обрабатываться только в квартире, в которой они были созданы.

Более подробная информация из MSDN:

Объекты, созданные в однопоточной квартире (STA), получают вызовы метода только из streamа их квартиры, поэтому вызовы сериализуются и поступают только в границах очереди сообщений (когда вызывается функция Win32 PeekMessage или SendMessage).

Объекты, созданные в streamе COM в многопоточной квартире (MTA), должны иметь возможность принимать вызовы методов из других streamов в любое время. Обычно вы реализуете некоторую форму контроля параллелизма в коде многопоточного объекта с использованием примитивов синхронизации Win32, таких как критические разделы, семафоры или мьютексы, чтобы защитить данные объекта.

Когда объект, который настроен для работы в нейтральной резьбовой квартире (NTA), вызывается streamом, который находится в STA или MTA, этот stream передает в NTA. Если этот stream впоследствии вызывает CoInitializeEx, вызов завершается с ошибкой и возвращается RPC_E_CHANGED_MODE.

STAThread записывается перед главной функцией проекта C # GUI. Он ничего не делает, но позволяет программе создавать один stream.

  • Что будет использоваться для обмена данными между streamами, выполняются на одном ядре с HT?
  • Тестирование безопасности инициализации конечных полей
  • Java: Как проверить методы, которые вызывают System.exit ()?
  • Как бы вы реализовали свой собственный механизм чтения / записи в C ++ 11?
  • Убийство streamа после определенного срока в Java
  • Можно ли использовать строку в качестве объекта блокировки?
  • Анимация при использовании Gridbag Layout.
  • Когда и как следует использовать переменную ThreadLocal?
  • Как подождать, когда BackgroundWorker отменит?
  • Как ASP.NET многопоточен?
  • ThreadPool.QueueUserWorkItem vs Task.Factory.StartNew
  • Давайте будем гением компьютера.